【问题标题】:List comprehension to get a 2D list of the same values列表理解以获取相同值的 2D 列表
【发布时间】:2021-06-15 18:01:16
【问题描述】:

我有以下数字:

arr = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]

我想创建一个列表理解,它将匹配我在二维列表数组中的所有相同值,例如:

[[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]

我尝试了类似的方法:

listArr = sorted(arr)

不幸的是,我不知道如何将排序后的数字放入列表的二维数组中。

【问题讨论】:

    标签: python list list-comprehension


    【解决方案1】:

    您可以创建临时字典对数字进行分组:

    s = "4 5 5 5 6 6 4 1 4 4 3 6 6 3 6 1 4 5 5 5"
    
    out = {}
    for d in s.split():
        out.setdefault(d, []).append(int(d))
    
    out = sorted(out.values())
    print(out)
    

    打印:

    [[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]
    

    如果s 是一个list 的数字:

    out = {}
    for d in s:
        out.setdefault(d, []).append(d)
    
    out = sorted(out.values())
    print(out)
    

    【讨论】:

      【解决方案2】:

      itertools.groupby:

      from itertools import groupby
      
      arr = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]
      
      out = [[*gr] for _, gr in groupby(sorted(arr))]
      

      其中分组键是排序数组中的值本身,组是连续值。 [*gr] 是一种从这些值中形成列表的方法,也可以在其中使用 list(gr)

      得到

      >>> out
      
      [[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]
      

      【讨论】:

        【解决方案3】:
        s = "4 5 5 5 6 6 4 1 4 4 3 6 6 3 6 1 4 5 5 5"
        l = list(map(int, s.split()))
        output = [[val] * l.count(val) for val in set(l)]
        

        输出:

        [[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]
        

        【讨论】:

          【解决方案4】:

          排序后可以使用itertools.groupby

          >>> L = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]
          >>> from itertools import groupby
          >>> [list(group) for _key, group in groupby(sorted(L))]
          [[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]
          

          但是,在Andrej's answer 中进行排序可能更有效,因为这意味着交换次数更少。

          【讨论】:

            猜你喜欢
            • 2015-08-22
            • 1970-01-01
            • 2013-07-20
            • 1970-01-01
            • 1970-01-01
            • 2018-11-18
            • 2013-09-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多