假设我有两个列表:
x = [1,2,3,4]
y = [1,4,7,8]
我想将 y 中尚未在 x 中的任何值附加到 x。我可以通过循环轻松做到这一点:
for value in y:
if value not in x:
x.append(value)
但我想知道是否有更 Pythonic 的方式来做到这一点。
像这样的东西:
In [22]: x = [1,2,3,4]
In [23]: y = [1,4,7,8]
In [24]: x += [ item for item in y if item not in x]
In [25]: x
Out[25]: [1, 2, 3, 4, 7, 8]
+=
充当list.extend
,所以上面的代码等价于:
In [26]: x = [1,2,3,4]
In [27]: lis = [ item for item in y if item not in x]
In [28]: x.extend(lis)
In [29]: x
Out[29]: [1, 2, 3, 4, 7, 8]
请注意,如果列表的大小
x
很大并且您的列表 x/y 仅包含不可变(可散列)项目,那么您必须sets
在此处使用,因为它们会将时间复杂度提高到O(N)
.
>>> x = [1,2,3,4]
>>> y = [1,4,7,8]
>>> set_x = set(x) # for fast O(1) amortized lookup
>>> x.extend(el for el in y if el not in set_x)
>>> x
[1, 2, 3, 4, 7, 8]
如果您不关心结果的顺序,您可以这样做:
>>> x=[1,2,3,4]
>>> y=[1,4,7,8]
>>> x = list(set(x + y))
>>> x
[1, 2, 3, 4, 7, 8]
x = [1,2,3,4]
y = [1,4,7,8]
现在我们想将 y 中尚未存在于 x 中的任何值附加到 x。这可以很容易地完成,因为:
temp = [item for item in y if item not in x]
x.extend(temp)
这将首先将所有不在 x 中但存在于 y 中的元素放入一个名为 temp 的列表中。现在我们将扩展列表 x 以包含来自 temp 的元素。希望能帮助到你。