52

我有一个清单,a

a = ['a','b','c']

并且需要以这种方式添加后缀来复制一些值_ind(顺序很重要):

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

我试过了:

b = [[x, x + '_ind'] for x in a]
c = [item for sublist in b for item in sublist]
print (c)
['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

有没有更好、更 Pythonic 的解决方案?

4

6 回答 6

66

你可以把它变成一个生成器:

def mygen(lst):
    for item in lst:
        yield item
        yield item + '_ind'

>>> a = ['a','b','c']
>>> list(mygen(a))
['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

您也可以使用itertools.productitertools.starmaporitertools.chain或 嵌套推导,但在大多数情况下,我更喜欢简单易懂的自定义生成器函数。


在 python3.3 中,您还可以使用yield from生成器委托来使这个优雅的解决方案更加简洁:

def mygen(lst):
    for item in lst:
        yield from (item, item + '_ind')
于 2017-07-15T19:51:03.713 回答
29

通过将选项移动到列表理解中的内部 for 循环,可以稍微缩短它:

a = ['a','b','c']

[item for x in a for item in (x, x + '_ind')]
# ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
于 2017-07-15T19:50:30.190 回答
15

拼接的另一种选择(Python2.x,3.x):

result = [None] * len(a) * 2
result[::2], result[1::2] = a, map(lambda x: x + '_ind', a)

result
# ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
于 2017-07-15T20:00:48.627 回答
6

您可以使用itertools.chain()

import itertools

l = ['a','b','c']

new_list = list(itertools.chain.from_iterable([[i, i+"_ind"] for i in l]))

print new_list

输出:

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
于 2017-07-15T19:58:17.063 回答
5

在列表推导和生成器被发明/普及之前,人们过去认为要简单得多1

>>> a = ['a', 'b', 'c']
>>> b = []
>>> for x in a: b.extend([x, x+'_ind'])
... 
>>> b
['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

*我并不是说那些构造/工具是邪恶的,只是想指出有一个简单的解决方案。

于 2017-07-17T16:30:45.867 回答
4

既然你要求“简单”,我想我会把它扔进去(虽然,也许不是pythonic这样):

for i in mylist: 
    mylist1.append(i);
    mylist1.append(i + '_ind');
于 2017-10-06T09:39:56.103 回答