代码之家  ›  专栏  ›  技术社区  ›  Roman

将列表分组为列表列表

  •  -4
  • Roman  · 技术社区  · 7 年前

    我有一个“mylist”列表,如下所示:

    l = [2,4,4,3,9,9,1]
    

    如果每个元素都是它的倍数,我必须对它的元素进行分组。 预期结果是:

    result = [[4,4], [9,9]]
    

    我做了如下工作:

    mylist = [2,4,4,3,9,9,1]
    
    
    results = [] 
    for l in mylist:
        res = [l for l in mylist if l*2 == l]
        results.append(res)
    
    
    print (results)   
    
    [[], [], [], [], [], [], []]
    whoops, what's error guys?
    
    3 回复  |  直到 7 年前
        1
  •  4
  •   James    7 年前

    你可以使用 groupby itertools 包来执行此操作。它被设计成像元素一样组合在一起。下面的示例首先对列表进行排序,以确保将所有匹配的项放在一起。如果你不想那样做,只需删除 sorted ,它将仅对连续的匹配项进行分组。

    from itertools import groupby
    
    l = [2,4,4,3,9,9,1]
    
    x = [list(g) for _, g in groupby(sorted(l))]
    x = [e for e in x if len(e) > 1]
    
    x
    # returns:
    [[4, 4], [9, 9]]
    
        2
  •  3
  •   Aran-Fey Kevin    7 年前

    您可以使用 collections.Counter 要计算每个值在列表中出现的次数,然后从至少出现两次的所有值中创建一个新列表,请执行以下操作:

    import collections
    
    counter = collections.Counter(l)
    result = [[value]*count for value, count in counter.items() if count > 1]
    
    print(result)
    # output: [[9, 9], [4, 4]]
    
        3
  •  1
  •   Laurent H. chthonicdaemon    7 年前

    使用原始代码,为输入列表的每个元素创建一个新列表( res )它包含每个等于其double的元素(仅适用于零值),然后将其附加到输出列表中。
    所以它根本不起作用。

    我可以向您推荐此解决方案,无需任何额外的软件包,并且易于阅读:

    l = [2,4,4,3,9,9,1]
    
    results = []
    for i in set(l):
        if l.count(i) > 1:
            results.append([i]*l.count(i))
    
    print(results)
    

    我还添加了单线式解决方案:

    l = [2,4,4,3,9,9,1]
    
    results = [[i]*l.count(i) for i in set(l) if l.count(i) > 1]
    
    print(results)