【问题标题】:Most efficient way to intersect list of lists in Python?在 Python 中与列表相交的最有效方法是什么?
【发布时间】:2018-03-04 06:40:19
【问题描述】:

我之前问过一个关于阅读 CSV 和使用 Pandas 的问题,虽然这让我更接近答案,但这并不是我想要的。

我有两个列表:

a1 = [['1', 'foo'], ['2', 'bar'], ['3', 'Foo']]
a2 = [['1', 'foo'], ['2', 'bar'], ['3', 'Foo'], ['4', 'Bar']]

我正在寻找这些东西:

  • a1 中不在 a2 中的所有项目,搜索第一个值
  • a2 中不在 a1 中的所有项目,搜索第一个值
  • a1 和 a2 中的所有项目,搜索第一个值
    • 对于此交集中的每个项目,第二个值匹配的所有项目的列表
    • 对于此交集中的每个项目,列出第二个值不匹配的所有项目

我从我想要使用 Pandas 的 CSV 文件中获取数据,现在我以上面显示的列表格式获取它们。提前致谢!

【问题讨论】:

标签: python algorithm pandas csv numpy


【解决方案1】:

最简单的解决方案是将其转换为集合

a1 = [['1', 'foo'], ['2', 'bar'], ['3', 'Foo']]
a2 = [['1', 'foO'], ['2', 'bar'], ['3', 'Foo'], ['4', 'Bar']]

a1_set = set([v[0] for v in a1])
a2_set = set([v[0] for v in a2])

print("Items in a1,but not a2:",[x for x in a1 if x[0] in a1_set-a2_set])
print("Items in a2,but not a1:",[x for x in a2 if x[0] in a2_set-a1_set])

d1 = dict(a1)
d2 = dict(a2)
items_in_both = [(k,(d1[k],d2[k]) if d1[k] != d2[k] else d1[k]) for k in a2_set&a1_set]

print("Items in both sets:", items_in_both)

【讨论】:

  • 您可以使用pypi.python.org/pypi/ordered-set维护秩序
  • 您能否进一步解释一下您按每个子列表中的第一项排序的位置?
  • 让我在星期一试试这个,如果我能够成功完成这个工作,我会回复;感谢您的回复!
【解决方案2】:

所以,基本上你想找到一个列表中而不是另一个列表中的元素:

[x for x in a2 if x not in a1]

如果你想要通用元素,你可以使用:

[x for x in a2 if x in a1]

【讨论】:

  • 但是,这里的问题是您只对单个值进行排序。我想对列表列表中的第一个值进行排序。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
相关资源
最近更新 更多