具有重复值和后缀的列表

时间:2017-07-15 19:45:23

标签: python list list-comprehension suffix

我有一个列表,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的解决方案?

6 个答案:

答案 0 :(得分:53)

你可以把它变成一个发电机:

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.starmapitertools.chain或嵌套的理解来完成它,但在大多数情况下,我更喜欢简单易懂的自定义生成器函数。

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

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

答案 1 :(得分:26)

通过将选项移动到列表理解中的内部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']

答案 2 :(得分:14)

另一种使用拼接的替代方法(Python2.x,3.x):

In [642]: result = [None] * len(a) * 2

In [643]: result[::2], result[1::2] = a, map(lambda x: x + '_ind', a)

In [644]: result
Out[644]: ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

答案 3 :(得分:5)

您可以使用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']

答案 4 :(得分:3)

在列表理解和生成器被发明/变得普遍之前,人们过去认为更简单 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']

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

答案 5 :(得分:3)

既然你要求"简单",我以为我会把它扔进去(尽管可能不是pythonic方式):

for i in mylist: 
    mylist1.append(i);
    mylist1.append(i + '_ind');