Leg*_*end 51 python intersection list set
我正在玩python并且能够得到两个列表的交集:
result = set(a).intersection(b)
Run Code Online (Sandbox Code Playgroud)
现在,如果d是包含a和b第三个元素的列表c,是否有内置函数用于查找内部所有三个列表的交集d?所以,例如,
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
Run Code Online (Sandbox Code Playgroud)
那么结果应该是
[3,4]
Run Code Online (Sandbox Code Playgroud)
Sin*_*ion 66
set.intersection(*map(set,d))
Run Code Online (Sandbox Code Playgroud)
aar*_*ing 48
对于2.4,您可以只定义交叉函数.
def intersect(*d):
sets = iter(map(set, d))
result = sets.next()
for s in sets:
result = result.intersection(s)
return result
Run Code Online (Sandbox Code Playgroud)
对于较新版本的python:
intersection方法采用任意数量的参数
result = set(d[0]).intersection(*d[:1])
Run Code Online (Sandbox Code Playgroud)
或者,您可以将第一个集合与自身相交,以避免切片并制作副本:
result = set(d[0]).intersection(*d)
Run Code Online (Sandbox Code Playgroud)
我不确定哪个更高效,并且感觉它将取决于d[0]列表的大小和列表的大小,除非python有内置的检查,如
if s1 is s2:
return s1
Run Code Online (Sandbox Code Playgroud)
在交集方法中.
>>> d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
>>> set(d[0]).intersection(*d)
set([3, 4])
>>> set(d[0]).intersection(*d[1:])
set([3, 4])
>>>
Run Code Online (Sandbox Code Playgroud)
小智 11
@用户3917838
漂亮而简单,但需要一些铸造才能使其工作并因此给出一个列表。它应该看起来像:
list(reduce(set.intersection, [set(item) for item in d ]))
在哪里:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
结果是:
[3, 4]
至少在 Python 3.4 中
小智 10
您可以使用 获得任意数字集的交集set.intersection(set1, set2, set3...)。所以你只需要将你的列表转换成集合,然后将它们传递给这个方法,如下所示:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
set.intersection(*[set(x) for x in d])
Run Code Online (Sandbox Code Playgroud)
结果:
{3, 4}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38963 次 |
| 最近记录: |