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メソッドなどを参照しないでください。私のコードにはリスト内包表記が必要です。現時点で私が持っている唯一の代替手段は、for不便な 4 行のループです。

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

list最初にofを作成してから、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 パッケージがいかに強力であるかを示すのに最適な問題です。

繰り返し:オブジェクトの無限 (または制限まで) の iterable を作成します

izip: イテラブルを転置します。

chainイテラブルをアンラップします

>>> 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 に答える