双循环列表理解

list comprehension with double loops

我是编程新手。我对列表理解有疑问。我需要将一个列表划分为大小为 5 的元组,并且我的代码运行良好,但是如果我有一个列表列表的输入,我不知道如何在列表理解中插入双循环。我希望有人能帮助我。 这是我的代码:

big_list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
x = 5
bot = [tuple(big_list1[i: i + x])for i in range(0, len(big_list1), x)]

这是输出:

 bot=[(1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15)]

但是如果我有这样一个列表列表:

 my_list=[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5]]

我想要这个:

res=[[(1, 2, 3, 4, 5),(6, 7, 8, 9, 10),(11, 12, 13, 14, 15)], [(1, 2, 3, 4, 5),(6, 7, 8, 9, 10)], [(1, 2, 3, 4, 5)]]

我很困惑,因为循环中有“范围”,我不知道如何进行嵌套循环。

定义为一个函数:

def split_in_tuples(input_list, tuple_length):
    return [tuple(input_list[i: i + tuple_length]) for i in range(0, len(input_list), tuple_length)]

然后您可以像这样使用它:

big_list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
split_in_tuples(big_list1, 5)

给予

[(1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15)]

然后对于您的列表列表,您可以:

my_list=[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5]]
[split_in_tuples(sublist, 5) for sublist in my_list]

给出:

[[(1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15)], [(1, 2, 3, 4, 5), (6, 7, 8, 9, 10)], [(1, 2, 3, 4, 5)]]

如果你真的想使用列表理解,你可以按如下方式进行:

[[tuple(elem[i: i + x]) for i in range(0, len(elem), x)] for elem in my_list]

也许最终代码不是这样'cool' 无论如何,您的代码离解决方案不远,您必须添加外部循环(在我的解决方案中,我使用了具有相同命名的相同示例) 也许 this 会有用

my_list=[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5]]
x = 5
[[tuple(big_list1[i: i + x])for i in range(0, len(big_list1), x)] for big_list1 in my_list]

# [[(1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15)],
 [(1, 2, 3, 4, 5), (6, 7, 8, 9, 10)],
 [(1, 2, 3, 4, 5)]]

这就是你想要的。

提示

更一般地说,嵌套 lc 需要一点提示。 假设您需要嵌套 2 个列表理解,第一种方法是:

c = ['ab']
[a for a in b for b in c]

但这不起作用NameError: name 'b' is not defined 因为python,

的解析顺序

但以正确的方式重新排序,从右到左

[a for b in c for a in b]

运行 符合预期。

如果你想使用列表理解,你可以这样做(给定 my_listx 来自所述问题):

[[tuple(l[i: i + x]) for i in range(0, len(l), x)] for l in my_list]