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

问题描述 投票:1回答:4

我有两个列表,每两个元件的每一个包含多个子列表。我想创建一个只包含那些子列表的第一个元素在两个原有名单存在子列表的新列表。我可以使用列表理解或设置交叉做,在平面列表,但挣扎时,它是列表的列表。

例如(使用来自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']]

任何帮助,将不胜感激!

python list
4个回答
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])] 

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


0
投票

如何列表理解?

from operator import itemgetter

first = itemgetter(0)

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

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

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)

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])

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

© www.soinside.com 2019 - 2024. All rights reserved.