假设我有一个“常数”,例如:
ITEMS = [ "item1", "item2" ]
现在,我想创建一个包含ITEMS
的所有条目以及其他条目的数组。
显然,这是错误的:
more_things = [ "all", ITEMS ]
,因为它将整个数组放入新数组。但我希望新数组最后包含[ "all", "item1", "item2" ]
。
当然,我可以以某种方式迭代第一个数组,但是我想知道是否还有一种更惯用的线性方法来执行此操作。理想情况下,它应该适用于python2和python3。
答案 0 :(得分:2)
只需将它们与+
串联:
more_things = ["all"] + ITEMS
答案 1 :(得分:2)
如果您运行的是Python 3.5+,则最接近您的请求的地方是使用unpacking:
>>> ITEMS = ['item1', 'item2']
>>> ['all', *ITEMS]
['all', 'item1', 'item2']
在早期版本中,列表串联将执行以下操作:
>>> ITEMS = ['item1', 'item2']
>>> ['all'] + ITEMS
['all', 'item1', 'item2']
如果您只需要一个 iterable (即不一定是列表),则使用itertools.chain()
可能会更有效:
from itertools import chain
more_things = chain(['all'], ITEMS) # or wrap in list() to get a list
答案 2 :(得分:1)
在Python 3中,您可以执行以下操作:
ITEMS = [ "item1", "item2" ]
more_things = [ "all", *ITEMS ]
这是非常灵活的,因为它使您可以将多个列表(或一般的可迭代对象)和元素合并在一行中:
even_more_things = [ "all", *ITEMS, "the", *ITEMS, "items" ]
答案 3 :(得分:1)
我建议一种更明显的方法:list.insert
。
ITEMS.insert(0, 'all')
ITEMS
# ['all', 'item1', 'item2']
它就地修改了ITEMS
。
如果您不想修改ITEMS
,则可以创建一个副本...尽管此时,您还是希望使用更简单的选项之一,例如可迭代解包(*
)。 ..
ITEMS2 = ITEMS.copy()
ITEMS2.insert(0, 'all')
ITEMS2
# ['all', 'item1', 'item2']
答案 4 :(得分:0)
您也可以使用itertools.chain
from itertools import chain
more_things = list(chain(more_things, ITEMS))
当您要添加两个以上的列表时,此功能很有用。