使用python中的列表推导扩展列表

时间:2014-08-27 21:14:37

标签: python list-comprehension

所以,让我说我有名单     项目 = [' abc',' def',' tre']。

现在我想在每个列表项之前插入一个标志。

例如,新列表 items2 应为[' -g',' abc',' -g',&#39 ; def',' -g',' tre']。

我可以读取列表并在附加标志后附加每个列表,但我想以python的方式开始。

我想出的是:

items2.extend(['-g', i] for i in items )

这给了我一个包含较小列表的列表:

items2 = [['-g', 'abc'], ['-g', 'def'], ['-g', 'tre']]

我明白这是因为它等同于说

items2.extend([ ... ] , [ ... ], [ ... ])

有关于此的任何想法?感谢

4 个答案:

答案 0 :(得分:6)

[j for i in items for j in '-g', i]

答案 1 :(得分:3)

一种方法是使用zip

>>> items = ['abc', 'def', 'tre']
>>> zip(['-g', '-g', '-g'], items)
[('-g', 'abc'), ('-g', 'def'), ('-g', 'tre')]

之后,您可以使用itertools.chain展平列表:

>>> list(itertools.chain(*zip(['-g', '-g', '-g'], items)))
['-g', 'abc', '-g', 'def', '-g', 'tre']

请注意,由于函数调用开销,与简单列表理解相比,这是非常慢的:

In [17]: %timeit [j for i in items for j in '-g', i]
1000000 loops, best of 3: 923 ns per loop

In [18]: %timeit list(itertools.chain(*zip(['-g', '-g', '-g'], items)))
100000 loops, best of 3: 2.67 µs per loop

因此,为了提高性能和清晰度,建议您使用Robᵩ answer

答案 2 :(得分:2)

作为对其他优秀zip答案的补充,您可以使用itertools.repeat()代替“计算”项目:

>>> items = ['abc', 'def', 'tre']
>>> list(itertools.chain(*zip(itertools.repeat('-g'), items)))
#                             ^^^^^^^^^^^^^^^^^^^^^^
#                             repeat as much as needed
['-g', 'abc', '-g', 'def', '-g', 'tre']

如果你不喜欢 zip ,可以选择:

>>> list(itertools.chain(*[('-g', i) for i in items]))
['-g', 'abc', '-g', 'def', '-g', 'tre']

答案 3 :(得分:1)

另一种简单的方法是遍历列表并在每个元素后插入。

for i in range(len(items)):
   items.insert((i*2)+1,'-g')

当您将长度插入插入点时加倍,因此您需要将下一个元素放在(i * 2)+1