在Python中交叉列表列表的最有效方法是什么?

时间:2017-09-22 16:03:21

标签: python algorithm pandas csv numpy

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

我有两个清单:

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

我希望找回这些东西:

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

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

2 个答案:

答案 0 :(得分:2)

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

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)

答案 1 :(得分:0)

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

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

如果您想要使用公共元素:

[x for x in a2 if x in a1]