web-dev-qa-db-ja.com

値とサフィックスが重複したリスト

リストがあります、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ソリューションはありますか?

46
jezrael

あなたはそれをジェネレータにすることができます:

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.productitertools.starmapまたはitertools.chainまたはネストされた内包表記を使用してそれを行うこともできますが、ほとんどの場合、理解しやすいカスタムジェネレーター関数を使用します。


Python3.3では、yield from—ジェネレータの委任—を使用して、このエレガントなソリューションをもう少し簡潔にすることもできます。

def mygen(lst):
    for item in lst:
        yield from (item, item + '_ind')
60
MSeifert

リスト内包表記のオプションを内側の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']
26
Psidom

スプライシングの別の代替案(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']
16
cs95

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']
7
Ajax1234

「シンプル」を求めたので、私はこれを投入すると思いました(ただし、Pythonicの方法ではないかもしれません)。

for i in mylist: 
    mylist1.append(i);
    mylist1.append(i + '_ind');
5
Eladian

リスト内包表記とジェネレーターが発明/普及する前は、人々は以前よりずっと単純に考えていました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']

* これらの構成/ツールが悪であることを意味するのではなく、単純な解決策があることを指摘したかっただけです。

5
Leon