将4个列表制作成一个2元素嵌套列表

2024-09-28 22:19:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有四份不同长度的清单。而且每次我运行程序时,每个列表的长度都会不同。你知道吗

下面是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\清单和D\清单
  3. 我如何处理空名单的可能性

我也很确定我完全错了。一定有更好的办法。请帮忙。
我正在使用python3.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]]

Tags: 代码answer程序密码示例列表lenif
3条回答

我想我可能有办法解决这个听起来可疑的问题。不得不求助于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]]

使用迭代器和链接:

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只会跳过那些。你知道吗

呸。我想我明白了。我敢肯定,这可以清理一点,但它适用于所有提到的情况。它还可以处理任意数量的列表,也可以处理空列表。你知道吗

def remove_empties(list1):
    """removes any empty lists from our list"""
    list2 = [x for x in list1 if x]
    return list2

def merge_to_couples(new_list):
    answer = []
    new_list = remove_empties(new_list)

    while True:
        answer.append([new_list[0][0], new_list[1][0]])
        del new_list[0][0], new_list[1][0]

        new_list = remove_empties(new_list) #remove empty lists every iteration

        if len(new_list) == 0: #if length is 0, our work is done
            return answer 
        if len(new_list) == 1: #if length is 1, we need to append remaining numbers as lists with length 1
            for i in new_list[0]:
                answer.append([i])
            return answer


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

new_list = [A_list, B_list, C_list, D_list]

print merge_to_couples(new_list)

相关问题 更多 >