2016-02-04 9 views
5

2つのリストlist1list2の数字があります。同じ手順で繰り返していきたいと思います。このように:2つのリストを順に繰り返します。

for item in list1: 
    print(item.amount) 
    print(item.total_amount) 

for item in list2: 
    print(item.amount) 
    print(item.total_amount) 

しかし、それは冗長な感じです。私はfor item in list1 + list2:と書くことができますが、それは実行時の価格があります。

時間のない方法はありますか?

答えて

11

これはitertools.chainで行うことができます。

import itertools 

l1 = [1, 2, 3, 4] 

l2 = [5, 6, 7, 8] 

for i in itertools.chain(l1, l2): 
    print(i, end = " ") 

印刷されますどの:ドキュメントを1として

1 2 3 4 5 6 7 8 

を、chainは以下のん:

イテレータを作成します最初のiterableからexhになるまで要素を返しますすべてのイテラブルが使い果たされるまで、次のイテラブルに進む。

リストにあなたのリストを持っている場合は、itertools.chain.from_iterableが利用可能です:同じ結果が得られ

l = [l1, l2] 
for i in itertools.chain.from_iterable(l): 
    print(i, end= " ") 

かなり単純明快であるためにあなたは、関数を書いて、このためのモジュールをインポートしたくない場合は、次の

def custom_chain(*it): 
    for iterab in it: 
     yield from iterab 

これは、Pythonの2のためのPython 3、必要が戻ったばかりのyieldそれらを使用して、ループ:その拡張アンパック一般化と前、パイソン3.5に加え

def custom_chain(*it): 
    for iterab in it: 
     for val in iterab: 
      yield val 

、またリテラルリストで開梱可能:

for i in [*l1, *l2]: 
    print(i, end=' ') 

これは、l1 + l2よりやや速いですが、まだリストを作成してから投げます。それは最終的な解決策に過ぎません。

1

chain作品が、あなたはそれが一度だけ単一の関数を呼び出すために、モジュールをインポートするにはやり過ぎだと感じた場合、あなたはその行動をインラインで複製することができます(リスト1、リスト2)タプルを作成

for seq in (list1, list2): 
    for item in seq: 
    print(item.amount) 
    print(item.total_amount) 

がOであります(1)リストの長さに関して、リストを連結することと比較して有利に機能するはずです。

関連する問題