我列了个单子:["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']]
我该怎么补救呢?
4条答案
按热度按时间2j4z5cfb1#
为了清楚地说明如何按照Samwise的建议使用
zip_longest
:这个方法可以很容易地推广,因为
zip_longest
可以获得您想要迭代的任意多个参数。vc9ivgsu2#
Samwise和Jorge建议的
zip
/zip_longest
方法很好,但是也可以通过简单地迭代original_list
并在遇到每个元素时处理它来实现这一点。当你遍历
original_list
的时候,检查nested_list
的最后一个元素是否少于两个元素,如果不是,在nested_list
上追加一个新的空列表,如果少于两个元素(如果之前没有,现在是真的,因为你追加了一个空列表),在这个列表上追加当前元素:现在,
nested_list
看起来像是所需的输出:xienkqul3#
通过使用
zip
将每个偶数元素与对应的奇数元素配对,可以大致实现这一点(这与代码的前半部分大致相同):然后将最后一个元素(如果整个列表的长度为奇数)作为特殊情况处理:
也可以用这样一种方式构造
zip
,以便自己处理奇数情况(即在末尾添加一个伪元素,或者使用zip_longest
,然后在构建对列表时考虑到这一点),但我认为上述方式是最简单的。7fyelxc54#
只需删除此部分: