具有重复值和后缀的列表
List with duplicated values and 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 的解决方案?
可以通过将选项移动到列表理解中的内部 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']
你可以把它变成一个发电机:
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.product
、itertools.starmap
或 itertools.chain
或嵌套理解来实现,但在大多数情况下,我更喜欢简单易懂的自定义生成器函数。
使用 python3.3,您还可以使用 yield from
——生成器委托——使这个优雅的解决方案更加简洁:
def mygen(lst):
for item in lst:
yield from (item, item + '_ind')
您可以使用 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']
另一种拼接方案(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']
在列表推导式和生成器 invented/became 普及之前,人们过去常常想得更简单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']
* 我并不是说那些 constructs/tools 是邪恶的,只是想指出有一个简单的解决方案。
既然你要求 "simple",我想我会把它扔进去(虽然,也许不是 pythonic
的方式):
for i in mylist:
mylist1.append(i);
mylist1.append(i + '_ind');
我有一个列表,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 的解决方案?
可以通过将选项移动到列表理解中的内部 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']
你可以把它变成一个发电机:
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.product
、itertools.starmap
或 itertools.chain
或嵌套理解来实现,但在大多数情况下,我更喜欢简单易懂的自定义生成器函数。
使用 python3.3,您还可以使用 yield from
——生成器委托——使这个优雅的解决方案更加简洁:
def mygen(lst):
for item in lst:
yield from (item, item + '_ind')
您可以使用 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']
另一种拼接方案(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']
在列表推导式和生成器 invented/became 普及之前,人们过去常常想得更简单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']
* 我并不是说那些 constructs/tools 是邪恶的,只是想指出有一个简单的解决方案。
既然你要求 "simple",我想我会把它扔进去(虽然,也许不是 pythonic
的方式):
for i in mylist:
mylist1.append(i);
mylist1.append(i + '_ind');