【问题标题】:list comprehension with double loops双循环列表理解
【发布时间】:2022-01-12 09:36:48
【问题描述】:

我是编程新手。我对列表理解有疑问。我需要在大小为 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)]]

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

【问题讨论】:

    标签: python list for-loop list-comprehension


    【解决方案1】:

    也许最终的代码没有那么“酷” 无论如何,您的代码离解决方案不远,您必须添加外部循环(在我的解决方案中,我使用了具有相同命名的相同示例) 也许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]
    

    按预期运行。

    【讨论】:

      【解决方案2】:

      如果你真的想使用列表推导,你可以这样做:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          定义为函数:

          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)]]
          

          【讨论】:

          • 我觉得我明白了,真的用函数更容易理解。谢谢!!
          猜你喜欢
          • 2021-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-30
          • 2013-09-10
          • 2023-03-11
          • 2018-05-11
          相关资源
          最近更新 更多