次の方法で2つのリストを繰り返す必要があります。
擬似コード:
j=1
for i=1 to n:
print a[i], b[j]
while b[j+1] <= a[i]:
j++
print a[i], b[j]
例えば:
a = [1 3 5 7]
b = [2 4 9]
必要な出力:
1 2
3 2
5 2
5 4
7 4
Pythonでどのようにきれいにそれを行いますか?
擬似コードはほとんどPythonで機能します。あなたが望むことをするいくつかの実用的なコードは次のとおりです。
a = [1, 3, 5, 7]
b = [2, 4, 9]
j = 0
for i in range(len(a)):
print a[i], b[j]
while j<len(b)-1 and b[j+1] <= a[i]:
j += 1
print a[i], b[j]
Pythonで機能させるためのいくつかの変更に注意してください。
i
そこj
から始める必要があります。len(a)
の長さa
(この場合は4)を返し、反復処理i
により、からrange(len(a))
の各整数のループが実行されます。これは、のすべてのインデックスです。0
len(a)-1
a
++
操作はPythonではサポートされていないため、j +=1
代わりに使用します。b
を確認するためにテストします。j
このコードは、次のようにリストを反復処理することで、よりPythonicにすることができます。
a = [1, 3, 5, 7]
b = [2, 4, 9]
j = 0
for element in a:
print element, b[j]
while j<len(b)-1 and b[j+1] <= element:
j += 1
print element, b[j]
一般に、リスト要素だけを出力したくない場合は、次のようなジェネレーターを作成できます。
def sync_lists(a, b)
if b:
j = 0
for element in a:
yield (element, b[j])
while j<len(b)-1 and b[j+1] <= element:
j += 1
yield (element, b[j])
そして、以前と同じようにそれらを印刷することができます
a = [1, 3, 5, 7]
b = [2, 4, 9]
for (e1, e2) in sync_lists(a, b):
print e1, e2
murgatroid99の回答のジェネレーターコードはnext()
、インデックス演算の代わりに使用することで、(シーケンスのみではなく)任意のイテラブルに一般化できます。
def sync_list(a, b):
b = iter(b)
y, next_y = next(b), next(b)
for x in a:
yield x, y
while next_y <= x:
y, next_y = next_y, next(b)
yield x, y