リストがあります、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ソリューションはありますか?
あなたはそれをジェネレータにすることができます:
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')
リスト内包表記のオプションを内側の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']
スプライシングの別の代替案(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']
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']
「シンプル」を求めたので、私はこれを投入すると思いました(ただし、Pythonic
の方法ではないかもしれません)。
for i in mylist:
mylist1.append(i);
mylist1.append(i + '_ind');
リスト内包表記とジェネレーターが発明/普及する前は、人々は以前よりずっと単純に考えていました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']
* これらの構成/ツールが悪であることを意味するのではなく、単純な解決策があることを指摘したかっただけです。