所以,让我说我有名单 项目 = [' 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([ ... ] , [ ... ], [ ... ])
有关于此的任何想法?感谢
答案 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