具有重复值和后缀的列表

jez*_*ael 39 python list-comprehension list suffix

我有一个清单,a:

a = ['a','b','c']
Run Code Online (Sandbox Code Playgroud)

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

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
Run Code Online (Sandbox Code Playgroud)

我试过了:

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']
Run Code Online (Sandbox Code Playgroud)

我认为我的解决方案有点过于复杂.有没有更好,更pythonic的解决方案?

MSe*_*ert 55

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

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']
Run Code Online (Sandbox Code Playgroud)

你也可以用做它itertools.product,itertools.starmapitertools.chain或嵌套的内涵,但在大多数情况下,我宁愿一个简单的了解,自定义生成功能.


使用python3.3,您还可以使用yield from-generator委托 - 使这个优雅的解决方案更简洁:

def mygen(lst):
    for item in lst:
        yield from (item, item + '_ind')
Run Code Online (Sandbox Code Playgroud)

  • @cᴏʟᴅsᴘᴇᴇᴅWtf...从未见过这样的"内联"收益率.再玩一遍,这也是有用的:`list([(从(x,x +'_''得到))对于x中的x). (16认同)
  • 我可以建议一个列表理解版本吗?`list([((yield x),(yield(x +'_ ind')))for a in a); ['a','a_ind','b','b_ind','c','c_ind']` (5认同)
  • @StefanPochmann这只是py3k.他们为list comps添加了yield支持,以允许创建生成器. (3认同)
  • @idjaw哦等等,刚看到我的IDE上的红色下划线.的xD (3认同)
  • @StefanPochmann杀手.想用它发表答案吗?如果没有,我会编辑我的.:p (2认同)

Psi*_*dom 25

通过将选项移动到列表解析中的内部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']
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 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']
Run Code Online (Sandbox Code Playgroud)

  • @Bergi是的,因为带有yield的list comp会返回一个生成器. (2认同)

Aja*_*234 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
Run Code Online (Sandbox Code Playgroud)

输出:

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
Run Code Online (Sandbox Code Playgroud)

  • 我会使用[`chain.from_iterable`](https://docs.python.org/library/itertools.html#itertools.chain.from_iterable).这样你就不需要用`*`解压缩了 (4认同)

Leo*_*eon 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']
Run Code Online (Sandbox Code Playgroud)

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