Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有条件附加列表的最佳Python方式_Python_List Comprehension - Fatal编程技术网

有条件附加列表的最佳Python方式

有条件附加列表的最佳Python方式,python,list-comprehension,Python,List Comprehension,我肯定这个问题以前提过,但我找不到确切的例子 我有两个列表,希望将第二个列表附加到第一个列表,只有一个值不在那里 到目前为止,我已经有了可用的代码,但我想知道是否有更好的、更“Pythonic”的方法可以做到这一点: >>> list1 [1, 2, 3] >>> list2 [2, 4] >>> list1.extend([x for x in list2 if x not in list1]) >>> list1 [1,

我肯定这个问题以前提过,但我找不到确切的例子

我有两个列表,希望将第二个列表附加到第一个列表,只有一个值不在那里

到目前为止,我已经有了可用的代码,但我想知道是否有更好的、更“Pythonic”的方法可以做到这一点:

>>> list1
[1, 2, 3]
>>> list2
[2, 4]
>>> list1.extend([x for x in list2 if x not in list1])
>>> list1
[1, 2, 3, 4]
编辑 根据评论,此代码不满足仅添加一次,即:

>>> list1 = [1,2,3]
>>> list2 = [2,4,4,4]
>>> list1.extend([x for x in list2 if x not in list1])
>>> list1
[1, 2, 3, 4, 4, 4]
我怎么可能只得到:

[1, 2, 3, 4]

一种方法是使用内置类型:

您需要存储操作结果,如果要扩展
list1
,则可以将其分配给
list1

list1=list(set(list1).union(list2))
注意:请记住,这种方法可能无法保持列表中元素的顺序


希望这有帮助

如果您想维持订单,可以这样使用

from collections import OrderedDict
from itertools import chain
list1, list2 = [1, 2, 3], [2, 4]
print list(OrderedDict.fromkeys(chain(list1, list2)))
# [1, 2, 3, 4]
from itertools import chain
list1, list2 = [1, 2, 3], [2, 4]
print list(set(chain(list1, list2)))
# [1, 2, 3, 4]
如果元素的顺序不重要,您可以像这样使用
集合

from collections import OrderedDict
from itertools import chain
list1, list2 = [1, 2, 3], [2, 4]
print list(OrderedDict.fromkeys(chain(list1, list2)))
# [1, 2, 3, 4]
from itertools import chain
list1, list2 = [1, 2, 3], [2, 4]
print list(set(chain(list1, list2)))
# [1, 2, 3, 4]

通常,您会使用集合来维护唯一的值。元素的顺序重要吗?如果
list2
[2,4,4]
?如果
list1
[1,1,2,3]
list2
[2,4,4]
,预期的输出是什么?可能重复的
列表(set(list1).union(list2))
将避免构建中间列表对象。实际答案是:list1=list(set(list1)。union(list2))@PauloBu:
set(list1+list2)
构建中间列表对象,
set(list1)。union(list2)
构建中间集合对象,但会更小。@ardochigh在勾选答案之前,请检查这个答案的输出是否对您有利,如果输入是
list1,list2=[100200300],[200400]
@ardochigh-Oh-than-ok:)那么这是您能得到的最好的解决方案:)如果顺序重要,请检查我的答案。
list(orderedict.fromkeys(chain(list1,list2))
在Python 2.x和Python 3.x中都能工作。