How to find common elements in list of lists?
我正在尝试找出如何比较n个列表以找到公共元素。例如:
1 2 3 4 5 6 7 8 | p=[ [1,2,3], [1,9,9], .. .. [1,2,4] >> print common(p) >> [1] |
现在,如果我知道元素的数量,我可以做如下比较:
1 2 3 4 | for a in b: for c in d: for x in y: ... |
但如果我不知道P有多少个元素的话,这是行不通的。我看过这个比较两个列表的解决方案https://stackoverflow.com/a/1388864/1320800
但是在花了4个小时试图找到一种方法来实现递归之后,我仍然没有找到一个解决方案,所以任何帮助都将非常感谢!
您正在查找所有子列表的集合交集,应用于集合操作的数据类型是集合:
1 2 3 4 | result = set(p[0]) for s in p[1:]: result.intersection_update(s) print result |
1 2 3 4 5 | >>> p=[ [1,2,3], [1,9,9], [1,2,4]] >>> set(p[0]).intersection(*p) set([1]) |
一个简单的解决方案(一行)是:
1 | set.intersection(*[set(list) for list in p]) |
为什么不只是:
1 | set.intersection(*map(set, p)) |
结果:
1 | set([1]) |
或者像这样:
1 2 3 | ip = iter(p) s = set(next(ip)) s.intersection(*ip) |
结果:
1 | set([1]) |
编辑:
从控制台复制:
1 2 3 4 5 6 7 | >>> p = [[1,2,3], [1,9,9], [1,2,4]] >>> set.intersection(*map(set, p)) set([1]) >>> ip = iter(p) >>> s = set(next(ip)) >>> s.intersection(*ip) set([1]) |
1 | reduce(lambda x, y: x & y, (set(i) for i in p)) |
1 2 3 4 5 | p=[ [1,2,3], [1,9,9], [1,2,4]] ans = [ele[0] for ele in zip(*p) if len(set(ele)) == 1] |
结果:
1 2 | >>> ans [1] |
您正在查找所有子列表的集合交集,用于集合操作的数据类型是集合:
1 2 3 4 | result = set(p[0]) for s in p[1:]: result.intersection_update(s) print result |
但是,一个列表中有10个列表的限制。任何更大的事情都会导致"结果"列表出现问题。假设你已经把"结果"列入了
如果你依赖它的话,一定要确保你订购了它。