2017-02-14 12 views
2

['A'、 'B'、 'C​​'、 'D']と[1,2,3,4]というリストがあります両方のリストは常に同じ数の項目を持ちます。各文字列に番号を掛けなければならないので、探している最終製品は文字列のリストにint要素の要素リストを掛ける

[ D '、' D '、' D '、' D ']を含む。

ありがとうございます、ありがとうございます。

答えて

1

ネストされたリストの内包は、あまりにも動作します:上記で

>>> l1 = ['A', 'B', 'C', 'D'] 
>>> l2 = [1, 2, 3, 4] 
>>> [c for c, i in zip(l1, l2) for _ in range(i)] 
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 

zipはを返すタプル:

>>> t = list(zip(l1, l2)) 
>>> t 
[('A', 1), ('B', 2), ('C', 3), ('D', 4)] 

次に第二forループが結果に文字を追加するcount回実行されたすべてのタプルのために:

>>> [char for char, count in t for _ in range(count)] 
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
1

私は素敵な、効率的な実装のためのitertools.repeatを使用します。

>>> letters = ['A', 'B', 'C', 'D'] 
>>> numbers = [1, 2, 3, 4] 
>>> import itertools 
>>> result = [] 
>>> for letter, number in zip(letters, numbers): 
...  result.extend(itertools.repeat(letter, number)) 
... 
>>> result 
['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
>>> 

私もそれは非常に読みやすいと思います。

a = ['A', 'B', 'C', 'D'] 
b = [1, 2, 3, 4] 

final = [] 
for k,v in zip(a,b): 
    final += [k for _ in range(v)] 

print(final) 

出力:

0

コードは、インラインコメント

l1 = ['A', 'B', 'C', 'D'] 
l2 = [1, 2, 3, 4] 
res = [] 
for i, x in enumerate(l1): # by enumerating you get both the item and its index 
    res += x * l2[i] # add the next item to the result list 
print res 

OUTPUT

['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
0

あなたがこの方法のようにそれを行うにはzip()を使用するを参照して、かなり単純です。

>>> ['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 

それともzip()list comprehensionを使用して、あまりにも、それを行うことができます。

a = ['A', 'B', 'C', 'D'] 
b = [1, 2, 3, 4] 
final = [k for k,v in zip(a,b) for _ in range(v)] 
print(final) 

出力:

>>> ['A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'] 
関連する問題