2016-12-30 9 views
2

私は次のようにあるリストを持っている:list comprehension:入力リストの各項目に対して2つの項目を作成しますか?

list1 = ["pierre", "paul", "jacques"] 

私は次のようになり6つの項目に新しいリストを作成したいと思います:私は次のことを試してみました

list2 = ["pierre", "pierre#2","paul","paul#2", "jacques", "jacques#2"] 

list2 = [i, "{}#2".format(i) for i in list1 ] 

明らかに機能しませんでした。誰でも何がうまくいくのだろうか?

答えて

6

あなたは、ネストされたループでそれを行うことができます。for item in (...)内部ループが2つの項目ごとに生成

[item for i in list1 for item in (i, "{}#2".format(i))] 

+1

'itertools.chain(* zip(list1、map(" {}#2 ".format、list1)))'? :P –

+2

@JoranBeasley:ええ、いいえ。 –

2

おそらく、私はリスト内包されたネストされたリストを読みにくい唯一の人ですが、私はそれらをペストのように避ける傾向があります。この場合、私はおそらくバニラループ使用したい:

lst_out = [] 
for item in list1: 
    lst_out.extend((item, '{}#2'.format(item))) 

するか、別のオプションは、ジェネレータ関数である:

def gen(list1): 
    for item in list1: 
     yield item 
     yield '{}#2'.format(item) 

これは100%真実ではありません...私はそれを1回か2回使ったので、標準的なネストされたリストの平坦化イディオムは私にかなり分かりやすいです。たぶん私はちょうど彼らがより直感的になるように(他の回答が全て優れている)あなたがこれを行うことはない

0

...それらを使用して起動する必要がありますが、思想運動として:

from itertools import chain 
l = list(chain.from_iterable((x, x+'#2') for x in list1)) 
0

あなたは

list2 = [(i, "{}#2".format(i)) for i in list1] 
list2 = [x for y in list2 for x in y] 

生成する:

まだ(あなただけ tuple Sを作成するために、いくつかの括弧を欠落していた)、その後、その後タプルを「フラット化」あなたの試みを行うことができます3210
['pierre', 'pierre#2', 'paul', 'paul#2', 'jacques', 'jacques#2'] 
関連する問題