[英]Python - finding same elements in three lists (ignoring empty list)
I was wodnering if there was any way to find the common elements of three lists, whilst ignoring a list that is empty among the three. 如果有任何方法可以找到三个列表的共同元素,而忽略了三个列表中的空列表,那么我很想知道。 For example I know that:
例如,我知道:
a = ['a', 'b', 'c', 'd']
b = ['a', 'v', 'd', 'g']
v = ['d']
>>> set(a).intersection(b, v)
{'d'}
but I was wondering if there was a way to do this: 但我想知道是否有办法做到这一点:
a = ['a', 'b', 'c', 'd']
b = ['a', 'v', 'd', 'g']
v = []
>>> comparison_method(a, b, v)
{'a', 'd'}
Or if 2 out of 3 lists were empty, it would just return the list that wasn't. 或者,如果3个列表中的2个为空,则只返回不是的列表。
Using filter and then set intersection: 使用过滤器然后设置交集:
set.intersection(*map(set,filter(None, [a,[],[]])))
O/P: set(['a', 'c', 'b', 'd'])
O / P:
set(['a', 'c', 'b', 'd'])
set.intersection(*map(set,filter(None, [a,b,[]])))
O/P: set(['a', 'd'])
O / P:
set(['a', 'd'])
set.intersection(*map(set,filter(None, [a,b,v])))
O/P : set(['d'])
O / P:
set(['d'])
As jme suggested which is a more better solution 正如jme所说,这是一个更好的解决方案
set.intersection(*(set(x) for x in [a, b, v] if x))
Just filter out all the list that have len
(ie length is not zero) and use set-intersection
- 只过滤掉所有具有
len
的列表(即长度不为零)并使用set-intersection
-
>>>a = ['a', 'b', 'c', 'd']
>>>b = ['a', 'v', 'd', 'g']
>>>v=[]
>>>input_list = [a,v,b]
>>>result = reduce(set.intersection,map(set,filter(len,input_list)))
>>>set(['a', 'd'])
Sure, very similar to this , but just filter out the empty lists before running the intersection
test: 当然,非常类似于此 ,但只是在运行
intersection
测试之前过滤掉空列表:
def comparison_method(*args):
sets = [set(arg) for arg in args if arg]
if not sets:
return []
result = sets[0]
for s in sets[1:]:
result = result.intersection(s)
return result
a = ['a', 'b', 'c', 'd']
b = ['a', 'v', 'd', 'g']
v = []
>>> comparison_method(a, b, v)
{'a', 'd'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.