我有两个列表,可以是list
或None
。我想获得第三个列表,结果是唯一的联合这两个列表。
first
列表无且second
无 - result
将无 first
无且second
不是无 - result
将为second
second
无且first
不是无 - result
将为first
second
不是无且first
不是无 - result
将是first + second
如果条件:
,我就这么做了result = first if first else second
if result is not None:
try:
result = list(set(first + second))
except TypeError:
pass
我想以更好的方式做到这一点。也许你知道用itertools
或其他东西通过一个或多个字符串解决这个问题的方法。如果没有办法用另一种(更有效的)变体来解决这个问题,请不要贬低,只需说出来。
感谢您的所有建议!
答案 0 :(得分:2)
使用itertools.chain.from_iterable的单线程解决方案可以是:
set(itertools.chain.from_iterable((first or [], second or [])))
编辑:
我做了一些不同解决方案的时间,这是我在(在我的计算机上使用python3.6)获得10000次迭代以获得10000个项目的2个列表:
set((first or []) + (second or []))
):5.95 s 因此,itertools方式更快一点,chain
方法比列表的+
运算符更好:)。
答案 1 :(得分:0)
嗯,我很简单:如果列表是None
,请将其替换为空列表,然后连接两者:
def concat(l1, l2):
if l1 is None and l2 is None:
return None
elif l1 is None:
l1 = []
elif l2 is None:
l2 = []
s = set(l1 + l2)
return s
一些结果:
>>> concat(None, None) is None
True
>>> concat([1,2,3], None)
set([1, 2, 3])
>>> concat(None, [4,5])
set([4, 5])
>>> concat([1,2,3], [4,5])
set([1, 2, 3, 4, 5])
>>> concat([1,2,3], [])
set([1, 2, 3])
>>> concat([], [])
set([])
有很多方法可以做到这一点,但对我而言,这是一个明确的案例,没有必要聪明。