【问题标题】:Creating a new list based on matching elements of two nested lists in Python?根据Python中两个嵌套列表的匹配元素创建一个新列表?
【发布时间】:2019-02-06 03:04:48
【问题描述】:

我有两个列表,每个列表都包含多个包含两个元素的子列表。我想创建一个新列表,其中仅包含那些子列表的第一个元素存在于两个原始列表中的子列表。我可以使用列表推导或设置交集在平面列表中执行此操作,但在使用列表列表时会遇到困难。

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

任何帮助将不胜感激!

【问题讨论】:

  • 您可以只提取列表,然后从这些列表中提取数据并将其放入列表中。这不是最有效的方法,但它确实是一个不错的备用计划,以防万一没有其他方法。
  • 遍历 bpairs 并将水果名称放入哈希集中,然后创建一个新列表并遍历 apairs 并查看它们是否在集合中具有成员资格,这样行吗?
  • 感谢大家的帮助!所有提出的解决方案都适用于我提供的案例,但我也想在新列表中只包含一次。如果在任一列表中有多个包含相同第一个元素的对,我只想将第一个包含在新列表中(这样新列表包含第一个元素唯一的对)。很抱歉没有澄清 - 我已经更新了原始帖子以反映这一点。再次感谢!

标签: python list


【解决方案1】:

列表理解怎么样?

from operator import itemgetter

first = itemgetter(0)

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

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

【讨论】:

  • 谢谢!您对如何修改它以确保新列表中没有具有相同第一个元素的对有任何建议吗?我已更新原始帖子以包含此信息。再次感谢!
【解决方案2】:

您可以简单地遍历两个列表并比较值。同样的示例代码 sn-p 是:

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

这将返回一个列表列表,其中包含两个列表中的匹配元素。

【讨论】:

  • 谢谢!你知道如何修改它以确保新列表中没有具有相同第一个元素的对吗?我已经更新了上面的示例,这段代码包括几对包含“apple”的代码。您对如何解决此问题有任何想法吗?再次感谢!
【解决方案3】:
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)

【讨论】:

  • 谢谢!您如何修改此代码以避免与输出列表中的第一个元素相同的对?抱歉,应该在原始帖子中包含此信息 - 现在已更新。
  • 只需将“if apairs[i][0] in bfruits:”更改为“if apairs[i][0] not in bfruits”
【解决方案4】:

感谢大家的帮助!我根据@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])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2014-02-11
    • 2015-04-29
    • 2019-06-26
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多