4

長さが異なる 4 つのリストがあります。また、プログラムを実行するたびに、各リストの長さが異なります。

4 つの可能なリストの簡単な例を次に示します。

A_list = [1, 2, 3]
B_list = [4]
C_list = [5, 6, 7, 8]
D_list = [9, 10]

次のような新しいリストを作成したいと思います。

answer = [[1, 4], [2, 5], [3, 6], [7, 9], [8, 10]]

これまでのところ、これは私のコードです。

answer = []
answer.append(list(zip(A_list, B_list)))

if len(A_list) < len(B_list):
        leftover_V_list = V_list[len(B_list):] 
        answer.append(list(zip(leftover_B_list, C_list)))

elif len(A_list) > len(B_list):
        leftover_A_list = A_list[len(B_list):]
        answer.append(list(zip(leftover_A_list, C_list)))

print(answer)

>>> 
[[(1, 4)], [(2, 5), (3, 6)]]

したがって、私のコードにはいくつかの問題があります。ここに私が苦労しているいくつかのことがあります:

  1. 正しい数値を取得していますが、形式が間違っています。
  2. C_list と D_list の残りの部分に進む方法がわからない
  3. 空のリストの可能性にどう対処するか

また、私はこれについて完全に間違っていると確信しています。これを行うためのより良い方法があるはずです。助けてください。
私はpython 3.2.3を使用しています

リストの例を次に示します。

A_list = [1]
B_list = [2, 3]
C_list = [4, 5, 6, 7]
D_list = [8]

answer =  [[1, 2], [3, 4], [5, 8], [6], [7]]

A_list = [1, 2, 3]
B_list = []
C_list = [4]
D_list = [5, 6]

answer =  [[1, 4], [2, 5], [3, 6]

A_list = [1, 2, 3]
B_list = []
C_list = []
D_list = [5, 6]

answer =  [[1,5], [2,6], [3]]

A_list = [1]
B_list = [2]
C_list = [3]
D_list = [4]

answer =  [[1, 2], [3, 4]]
4

3 に答える 3

2

イテレータと連鎖を使用します。

from itertools import chain

A_iter, B_iter, C_iter, D_iter = (iter(l) for l in (A_list, B_list, C_list, D_list))
chain_a = chain(A_list, B_list)
chain_b = chain(B_list, C_list)

paired = [list(t) for t in chain(zip(chain_a, chain_b), zip(C_iter, D_iter))]

出力:

>>> A_iter, B_iter, C_iter, D_iter = (iter(l) for l in (A_list, B_list, C_list, D_list))
>>> chain_a = chain(A_iter, B_iter)
>>> chain_b = chain(B_iter, C_iter)
 >>> [list(t) for t in chain(zip(chain_a, chain_b), zip(C_iter, D_iter))]
[[1, 4], [2, 5], [3, 6], [7, 9], [8, 10]]

これは空のリストでも機能しますchain。単にそれらをスキップするからです。

于 2013-04-12T16:15:51.510 に答える
1

この怪しげな問題の解決策があると思います。に頼る必要がありましたdeque

from collections import deque
from itertools import repeat, izip, izip_longest
A_list = [1, 2, 3]
B_list = [4]
C_list = [5, 6, 7, 8]
D_list = [9, 10]

def popper(x, reserve=None):
  for y in x:
    while y:
      yield y.popleft()
      while reserve:
        yield reserve.popleft()

def generate_couples(A, B, C, D):
  A = deque(izip(A, repeat(1)))
  B = deque(izip(B, repeat(2)))
  C = deque(izip(C, repeat(3)))
  D = deque(izip(D, repeat(4)))
  reserve = deque()
  a, b = popper([A, B, C, D],reserve=reserve), popper([B, C, D]) 
  for (x, y) in izip_longest(a, b):
    if not y:
      yield [x[0], None]
      continue
    while x[1] == y[1]:
      reserve.append(y)
      y = next(b)
    yield [x[0], y[0]]

print list(generate_couples(A_list, B_list, C_list, D_list))
[[1, 4], [2, 5], [3, 6], [7, 9], [8, 10]]
A_list = [1, 2, 3]
B_list = [4]
C_list = [5, 6, 7, 8, 9, 10]
D_list = [11]
print list(generate_couples(A_list, B_list, C_list, D_list))                
[[1, 4], [2, 5], [3, 6], [7, 11], [8, None], [9, None], [10, None]]
于 2013-04-12T17:59:59.620 に答える