根据嵌套列表中特定索引处的元素过滤列表

3

我有一个包含列表的列表,其中包含以下内容:

[['4.2','3.4','G'],['2.4','1.2','H'],['8.7','5.4','G']]

我希望能够通过引用列表中每个子列表的第三个部分中的字母,从列表中获取列表的值。

例如,我希望Python打印出列表中每个项目所代表的字母“G”元素。

output = [4.2,3.4]
         [8.7,5.4]

以下是我尝试过的内容:

L = [['4.2','3.4','G'],['2.4','1.2','H'],['8.7','5.4','G']]
newList = []

for line in L:
    if line[0][2] == 'G'
        newList.append([float(i) for i in line[0:2]])
print(newList)

我的错误可能在第5行,因为我不确定是否能以这种方式完成。谢谢。


在 if 语句中为什么要与 'house' 进行比较? - Lysandros Nikolaou
7个回答

3

简单的列表推导式:

L = [['4.2','3.4','G'],['2.4','1.2','H'],['8.7','5.4','G']]
newList = [l[0:2] for l in L if l[2] == 'G']

print(newList)

输出结果:
[['4.2', '3.4'], ['8.7', '5.4']]

2

我建议使用collections.defaultdict作为多值字典:

from collections import defaultdict
d = defaultdict(list)
for x in L:
    d[x[2]].append(x[:2])

现在,您可以使用d['G']来获取您想要的内容,但也可以使用d['H']来获取'H'的结果!注意:本段翻译编辑自Python字典中一个key对应多个value值

1

你的代码有两个问题,

1. line = ['4.2', '3.4', 'G'] for 1st iteration
hence to check for 'G', look out for line[2] == 'G' instead of line[0][3] == 'G'
2. use 'G' instead off 'house'.

>>> for line in L:
...   if line[2] == 'G':
...     newList.append([float(i) for i in line[0:2]])
... 
>>> newList
[[4.2, 3.4], [8.7, 5.4]]

0

你可以通过迭代列表的列表来使用字典。

lst = [['4.2','3.4','G'],['2.4','1.2','H'],['8.7','5.4','G']]
dict1 = {}

for l in lst:
    if l[2] in dict1.keys():
        dict1[l[2]].append(l[0:2])
    else:
        dict1[l[2]] = [l[0:2]]
        print l[0:2]

print dict1['G']

0

您可以使用列表推导式结合 map 的方式创建一个函数来返回基于元素的子列表:

def get_element_by_alpha(alpha, data_list):
    #        v map returns generator object in Python 3.x,hence type-cast to `list`
    return [list(map(float, s[:2])) for s in data_list if s[2]==alpha]
    #                 ^ type-cast the number string to `float` type 

示例运行:

>>> my_list = [['4.2','3.4','G'],['2.4','1.2','H'],['8.7','5.4','G']]

>>> get_element_by_alpha('G', my_list)
[[4.2, 3.4], [8.7, 5.4]]

>>> get_element_by_alpha('H', my_list)
[[2.4, 1.2]]

>>> get_element_by_alpha('A', my_list)  # 'A' not in the list
[]

0
一个列表推导式可以实现这个功能:
newList = [[float(j) for j in i[:-1]] for i in L if i[2]=='G']

0

@Electric 您的编辑代码。

L = [['4.2','3.4','G'],['2.4','1.2','H'],['8.7','5.4','G']]
newList = []

# line = ['4.2','3.4','G']
for line in L:
    if line[2] == 'G': # ':' was missing.
        newList.append(line[:2]) # line[:2] => ['4.2','3.4']
print(newList)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接