python-3.x 如何将列表以特定的方式变成嵌套?

wpx232ag  于 2023-03-04  发布在  Python
关注(0)|答案(4)|浏览(146)

我列了个单子:["a", "b", "c", "d", "e", "f", "g"]。我想让它嵌套并放入两个连续值的子列表中 从给定列表中。如果没有两个值 左,则一个值应转到子列表。因此所需结果为:[["a", "b"], ["c", "d"], ["e", "f"], ["g"]].
我试过这个:

original_list = ["a", "b", "c", "d", "e", "f", "g"]
nested_list = []

for i in range(0, len(original_list), 2):
    sublist = original_list[i:i+2]
    nested_list.append(sublist)

if len(original_list) % 2 != 0:
    nested_list[-2].append(nested_list[-1][0])
    nested_list.pop()

print(nested_list)

输出是正确的:[['a', 'b'], ['c', 'd'], ['e', 'f', 'g']].
但是对于这个例子:

original_list = ["a", "b", "c"]
nested_list = []

for i in range(0, len(original_list), 2):
    sublist = original_list[i:i+2]
    nested_list.append(sublist)

if len(original_list) % 2 != 0:
    nested_list[-2].append(nested_list[-1][0])
    nested_list.pop()

print(nested_list)

输出是[['a', 'b', 'c']]而不是[['a', 'b'], ['c']]
我该怎么补救呢?

2j4z5cfb

2j4z5cfb1#

为了清楚地说明如何按照Samwise的建议使用zip_longest

from itertools import zip_longest

combined = zip_longest(original_list[::2], original_list[1::2])
# Avoid None elements in the last list
nested_list= [[element for element in pair if element]
              for pair in combined]

这个方法可以很容易地推广,因为zip_longest可以获得您想要迭代的任意多个参数。

vc9ivgsu

vc9ivgsu2#

SamwiseJorge建议的zip/zip_longest方法很好,但是也可以通过简单地迭代original_list并在遇到每个元素时处理它来实现这一点。

nested_list = [[]]

当你遍历original_list的时候,检查nested_list的最后一个元素是否少于两个元素,如果不是,在nested_list上追加一个新的空列表,如果少于两个元素(如果之前没有,现在是真的,因为你追加了一个空列表),在这个列表上追加当前元素:

for item in original_list:
    if len(nested_list[-1]) >= 2:
        nested_list.append([])

    nested_list[-1].append(item)

现在,nested_list看起来像是所需的输出:

[['a', 'b'], ['c', 'd'], ['e', 'f'], ['g']]
xienkqul

xienkqul3#

通过使用zip将每个偶数元素与对应的奇数元素配对,可以大致实现这一点(这与代码的前半部分大致相同):

>>> original_list = ["a", "b", "c", "d", "e", "f", "g"]
>>> [list(pair) for pair in zip(original_list[::2], original_list[1::2])]
[['a', 'b'], ['c', 'd'], ['e', 'f']]

然后将最后一个元素(如果整个列表的长度为奇数)作为特殊情况处理:

>>> nested_list = [list(pair) for pair in zip(original_list[::2], original_list[1::2])]
>>> if len(original_list) % 2:
...     nested_list.append([original_list[-1]])
...
>>> nested_list
[['a', 'b'], ['c', 'd'], ['e', 'f'], ['g']]

也可以用这样一种方式构造zip,以便自己处理奇数情况(即在末尾添加一个伪元素,或者使用zip_longest,然后在构建对列表时考虑到这一点),但我认为上述方式是最简单的。

7fyelxc5

7fyelxc54#

只需删除此部分:

if len(original_list) % 2 != 0:
    nested_list[-2].append(nested_list[-1][0])
    nested_list.pop()

相关问题