【问题标题】:how to classify a list of lists by elements length?如何按元素长度对列表列表进行分类?
【发布时间】:2019-07-19 14:59:39
【问题描述】:

我有一个列表,看起来像这样:

List=[[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]

我想根据列表元素的长度对列表元素进行分类,所以结果如下:

2ElelmentSublist=[[1,3],[4,7]]
4ElementSublist=[[3,4,7,9],[2,4,5,3]]
....

等等。

我读了一篇关于itertools.groupby()的帖子, 但我不知道如何在我的情况下应用它。 有什么pythonic方法可以做到这一点?

注意:不需要将结果放在单独的变量中,我需要一种方法来知道我有多少种长度,以及一种分别到达每个组的方法。

提前谢谢你。

【问题讨论】:

    标签: python arrays arraylist


    【解决方案1】:

    您不能使用要在运行时决定的动态名称来制作列表(例如您的 2ElementSublist 左右。)

    但是您可以设计一个字典,其中键为长度,值为列表列表。

    试试这个:

    result = {}
    for L in List:
        result.setdefault(len(L), list()).append(L)
    print(result)
    

    你会看到

    {2: [[1, 3], [4, 7]], 4: [[3, 4, 7, 9], [2, 4, 5, 3]], 3: [[5, 7, 4]]}
    

    .setdefault(k, d) 可以让您访问键 k 的字典值,或者使用默认值 d 进行初始化。然后附加每个列表。

    【讨论】:

    • 这段代码对我来说很完美。但是今天我发现当我对它们进行采样时,一些列表返回了失真(它们的元素顺序发生了变化),我想知道代码中的问题:
    • 抱歉我的评论没有完成:我的意思是列表元素顺序被扭曲了:例如:Lengths=list(result.keys()), LeftLists=result(lengths[0])#( 这是获取第一个长度的项目),leftListsSample=random.sample(LeftLists)。现在我得到一些乱序的列表,例如像 l=[1,3,4,5] 这样的列表,在示例中它会像 [4,3,5,1]。
    • 我认为你应该为此发布一个新问题。
    • 谢谢,我发现了问题,我使用 list.sort() 代替 sorted(list) 对长度进行排序,这会导致原始列表发生变异。 Python 有时如此令人困惑。
    【解决方案2】:

    可能不是最pythonic,但您可以调用类似于您想要的值。

    x = [[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]
    dic = {f"{len(i)}_elelment": [] for i in x}
    
    for i in x:
        dic[f"{len(i)}_elelment"].append(i)
    
    
    # {'2_elelment': [[1, 3], [4, 7]], 
    #  '4_elelment': [[3, 4, 7, 9], [2, 4, 5, 3]], 
    #  '3_elelment': [[5, 7, 4]]}
    

    【讨论】:

    • 非常感谢您的帮助。
    【解决方案3】:

    既然您提到您需要按len 分组的列表,并且需要将它们放在单独的变量中,我认为您将需要dict 作为您的最终输出。

    from itertools import groupby, chain
    from collections import defaultdict
    
    List=[[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]
    
    res = defaultdict(list)
    for _, v in groupby(sorted(List, key=len)):
        l = list(chain(*v))
        res[len(l)].append(l)
    
    # Output : defaultdict(list,
                {2: [[1, 3], [4, 7]],
                 3: [[5, 7, 4]],
                 4: [[3, 4, 7, 9], [2, 4, 5, 3]]})
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      List = [[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]
      
      sizes = set([(len(element)) for element in List])
      result = {}
      for element in List:
          if len(element) not in result.keys():
              result[len(element)] = []
          result[len(element)].append(element)
      print(result)
      

      result 是:

      {2: [[1, 3], [4, 7]], 4: [[3, 4, 7, 9], [2, 4, 5, 3]], 3: [[5, 7, 4]]}
      

      【讨论】:

      • 谢谢,感谢您的时间和精力。
      【解决方案5】:

      len使用groupby

      例如:

      from itertools import groupby
      
      lst = [[1,3],[3,4,7,9],[4,7],[2,4,5,3],[5,7,4]]
      print( [list(v) for k, v in groupby(sorted(lst, key=len), key=len)] )
      #or
      print( {k: list(v) for k, v in groupby(sorted(lst, key=len), key=len)} )
      

      输出:

      [[[1, 3], [4, 7]], [[5, 7, 4]], [[3, 4, 7, 9], [2, 4, 5, 3]]]
      {2: [[1, 3], [4, 7]], 3: [[5, 7, 4]], 4: [[3, 4, 7, 9], [2, 4, 5, 3]]}
      

      【讨论】:

      • 谢谢Rakesh,这是另一个解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多