基于Python中两个嵌套列表的匹配元素创建新列表?

时间:2019-02-06 03:04:48

标签: python list

我有两个列表,每个列表包含每个包含两个元素的多个子列表。我想创建一个新列表,该列表仅包含两个原始列表中都存在该子列表的第一个元素的那些子列表。我可以使用列表理解或设置交集在平面列表中完成此操作,但是在使用列表列表时会很费力。

例如(使用csv文件中的数据):

apairs = [['apple', '2.4\n'], ['banana', '2.3\n'], ['orange', '1.8\n'], 
          ['apple', '1.6\n']]
bpairs = [['grape', '2.3\n'], ['apple', '2.1\n'], ['apple', '2.0\n'],
          ['peach', '1.9\n'], ['plum', '1.5\n']]

我希望创建一个新列表,该列表仅包含两个子列表,其中子列表的第一个元素同时存在于两个外部列表中,并且仅包含与元素对的第一个实例。我希望从“ alist”中提取该对,使其包含该对的第二个元素。因此,在这种情况下,我想要的输出是:

intersectpairs = [['apple, '2.4\n']]

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:0)

intersectpairs = []
bfruits = set()

for i in range(0,len(bpairs)):
    bfruits.add(bpairs[i][0])

for i in range(0,len(apairs)):
    if apairs[i][0] in bfruits:
       intersectpairs.append(apairs[i])

print (intersectpairs)

答案 1 :(得分:0)

您可以简单地遍历两个列表并比较值。相同的示例代码片段是:

apairs = [['apple', '2.4\n'], ['banana', '2.3\n'], ['orange', '1.8\n']]
bpairs = [['grape', '2.3\n'], ['apple', '2.1\n'], ['peach', '1.9\n'], ['plum',     '1.5\n']]
intersectpairs = []
for i in apairs:
    for j in bpairs:
        if (i[0]==j[0]):
            intersectpairs.append(i)
print(intersectpairs)

[['apple', '2.4\n']]

或者如果您想使用列表理解

[i for i in apairs for j in bpairs if(i[0]==j[0])] 

这将返回一个列表列表,两个列表中都有匹配的元素。

答案 2 :(得分:0)

列表理解如何?

from operator import itemgetter

first = itemgetter(0)

[val for val in apairs if first(val) in map(first, bpairs)]

[['apple', '2.4\n']]

答案 3 :(得分:0)

感谢大家的帮助!我想出了一个基于@Mayank Mehtani答案的解决方案。对于将来有此问题的人,此代码可以解决问题:

intersectionpairs = []
intersectionfruits = []
bfruits = set()

for i in range(0,len(bpairs)):
    bfruits.add(bpairs[i][0])
print('bfruits:', bfruits)
for i in range(0,len(apairs)):
    if apairs[i][0] in bfruits and apairs[i][0] not in intersectionfruits:
        intersectionfruits.append(apairs[i][0])
        intersectionpairs.append(apairs[i])

可能不是最有效或最复杂的答案,但它会提供所需的输出!