2017-05-17 2 views
1

StackOverflowの助けを借りて私は前進しました。私は感謝しています。Pythonはrawイテレータを追加します

悲しいことに、私はもう一つの悩みを抱えてしまいました。私は少しの指導のために集団に期待することができました。

長い話を短くするために、私は実質的に以下のように、(Pythonの2.7で)2つのリストをマージする(この場合は2に)入れ変数を使用して、リスト1とリスト2の1の2よ:

ration = 2 
list1 = ['one', 'two', 'three', 'four', 'five'] 
list2 = ['A', 'B', 'C'] 
iter_list1 = iter(list1) 
iter_list2 = iter(list2) 

final = [] 
try: #broken when one of the iterators runs out (and StopIteration is raised) 
    while True: 
     for i in range(0,ratio): 
      final.append(next(iter_list1)) 
     final.append(next(iter_list2)) 
except StopIteration: 
    pass 
print(final) 

悲しいことに、それは私の場合はリスト1は、はるかに長いリスト2以上になることは100%確かですので、発生したエラーを除いて呼び出すとStopIterationがあるだろう、と私はlist2の[あなたがする場合duplciate]を、私はコピーできることを願っていますlist1がなくなるまで20 - LIST1ははるかに大きくなる場合には、それが実行されます(リスト1を20まで保持していると言うことができます)6を

['one', 'two', 'A', 'three', 'four', 'B', 'five'] 

しかし、この場合にはそれが動作し、次のようになります。あなたの具体的な例を与えることを

リスト1に残ります。解消された結果は次のようになります。

['one', 'two', 'A', 'three', 'four', 'B', 'five', six, 'C', 'seven', 'eight', 'A', 'nine', 'ten', 'B', .... ] 

どのように進むべきか考えていますか? ありがとうございます!

+0

希望の結果はどうなりますか? –

+0

なぜあなたは2回行っていますか? "final.append(next(iter_list1))"?あなたが望む最終出力を共有しますか? – Arpit

答えて

1

あなたはlist2の各項目についてlist1から2つの項目をしたいように見えます。

あなたのイテレータを一緒にビュンことによって、これを達成することができます:

>>> list1 = ['one', 'two', 'three', 'four', 'five'] 
>>> list2 = ['A', 'B', 'C'] 
>>> it1 = iter(list1) 
>>> it2 = iter(list2) 
>>> 
>>> zip(it1, it1, it2) 
[('one', 'two', 'A'), ('three', 'four', 'B')] 

zipは、ラウンドロビン方式でその引数のそれぞれから、次の要素を取得します。この特定の場合、最初の2つの引数は同じであるため、list1から2つの要素を取得し、次にlist2から要素を取得します。

zipは、StopIteration例外が発生するとすぐにイテレータから要素の抽出を停止します。消耗したイテレータのデフォルト値をそのまま使用したい場合は、itertools.izip_longest(またはPython 3のitertools.zip_longest)を参照してください。

あなたの出力に応じて編集:結果を平坦化する必要があります。これはitertools.chainまたはリストの理解で行うことができます。

>>> it1, it2 = iter(list1), iter(list2) 
>>> [x for tup in zip(it1, it1, it2) for x in tup] 
['one', 'two', 'A', 'three', 'four', 'B'] 

>>> it1, it2 = iter(list1), iter(list2) 
>>> list(chain(*zip(it1, it1, it2))) 
['one', 'two', 'A', 'three', 'four', 'B'] 
+0

これはまだlist2がなくなるとlist1を切断しませんか?要するに、list1がなくなるまで、list2をどのように使い続けることができますか?私が言ったように – user5740843

+0

@ user5740843、 'itertools.izip_longest'を使用してください。 – timgeb

1

Itertools?

import itertools 
x = itertools.izip_longest(list1,list2) #x is a generator 
x_list = [i for i in x] #Returns list of tuples 
x_flattened_list = [j for i in x_list for j in i] 

これは、list2がなくなったときにNoneを追加します。 izip_longestのfillvalueパラメータを使用して必要な値を入力します。

https://docs.python.org/2/library/itertools.html#itertools.izip_longest

関連する問題