3

这一点很清楚:

a = ['a', 'b', 'c']
x = [v for v in a]

但我不知道该怎么做:

sep = 5
# ??? y = [v + sep for v in a]
print y # expected ['a', 5, 'b', 5, 'c', 5]

如何编写每个源元素包含多个元素的列表理解?

我对此代码的优化不感兴趣:请不要在这些行中引用[:]运算符或join方法或其他内容。我的代码需要列表理解。我目前唯一的选择是 4 行for循环,这很不方便:

y = []
for v in a:
    y.append(v)
    y.append(sep)
4

6 回答 6

6

使用嵌套的列表理解:

>>> a = ['a','b','c']
>>> [item  for x in a for item in (x, 5)]
['a', 5, 'b', 5, 'c', 5]
于 2013-10-07T16:50:16.250 回答
5

您可以先构建一个listof tuples,然后使用以下方法展平结果列表itertools.chain.from_iterable

>>> sep = 5
>>> a = ['a', 'b', 'c']
>>> 
>>> import itertools
>>> list(itertools.chain.from_iterable((elem, sep) for elem in a))
['a', 5, 'b', 5, 'c', 5]
于 2013-10-07T16:46:16.183 回答
1

只需使用该函数来sum()展平列表列表即可[[v,sep] for v in a][['a', 5], ['b', 5], ['c', 5]]

a = ['a', 'b', 'c']
x = [v for v in a]
sep = 5
y = sum([[v,sep] for v in a],[])
print y
#['a', 5, 'b', 5, 'c', 5]
于 2013-10-07T16:51:02.590 回答
1

这是一个完美的问题,展示了 Python 的 itertool 包有多强大

重复:创建对象的无限(或上限)可迭代对象

izip:转置可迭代对象。

解开一个可迭代的

>>> from itertools import izip, chain, repeat
>>> a = ['a', 'b', 'c']
>>> list(chain.from_iterable(izip(a, repeat(5))))
['a', 5, 'b', 5, 'c', 5]

如果你有微优化的诀窍,你可能有兴趣知道,这比列表理解更快

>>> stmt1 = """
list(chain.from_iterable((elem, 5) for elem in a))
"""
>>> stmt2 = """
list(chain.from_iterable(izip(a, repeat(5))))
"""
>>> timeit.timeit(stmt=stmt1, setup="from __main__ import chain, a", number=100000)
1.3136643729533688
>>> timeit.timeit(stmt=stmt2, setup="from __main__ import chain, izip, repeat, a", number=100000)
0.8959859753707633
>>> 
于 2013-10-07T16:54:32.037 回答
0
result = [5 if i % 2 else a[i/2] for i in range(2*len(a))]

(并不是说您应该将这样的代码投入生产)

于 2013-10-07T16:49:01.220 回答
0
>>> a = ['a', 'b', 'c']
>>> [item for sublist in zip(a, [5]*len(a)) for item in sublist]
['a', 5, 'b', 5, 'c', 5]

分解它:

>>> [5]*len(a)
[5, 5, 5]

>>> zip(a, [5]*len(a))
[('a', 5), ('b', 5), ('c', 5)]

然后使用以下成语将元组列表展平:

[item for sublist in l for item in sublist]

使用 timeit,这种方法比最快的 itertools 方法快 15%

>>> stmt3 = """
[item for sublist in zip(a, [5]*len(a)) for item in sublist]
"""
>>> timeit.timeit(stmt=stmt3, setup="a = ['a', 'b', 'c']", number=100000)
于 2013-10-07T17:04:17.290 回答