3

次の方法で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でどのようにきれいにそれを行いますか?

4

2 に答える 2

7

擬似コードはほとんど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で機能させるためのいくつかの変更に注意してください。

  1. リストを宣言するときは、項目の間にコンマが必要です。
  2. リストインデックスは0から始まるので、両方ともiそこjから始める必要があります。
  3. len(a)の長さa(この場合は4)を返し、反復処理iにより、からrange(len(a))の各整数のループが実行されます。これは、のすべてのインデックスです。0len(a)-1a
  4. この++操作はPythonではサポートされていないため、j +=1代わりに使用します。
  5. の範囲外のインデックスを使用しないようにする必要があるため、増分する前に範囲内にあること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
于 2012-08-06T17:15:04.810 に答える
2

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
于 2012-08-06T18:45:07.067 に答える