双循环列表理解
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_list
和 x
来自所述问题):
[[tuple(l[i: i + x]) for i in range(0, len(l), x)] for l in my_list]
我是编程新手。我对列表理解有疑问。我需要将一个列表划分为大小为 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_list
和 x
来自所述问题):
[[tuple(l[i: i + x]) for i in range(0, len(l), x)] for l in my_list]