【问题标题】:Making a special sort of dictionary制作一种特殊的字典
【发布时间】:2019-06-08 21:51:59
【问题描述】:

我有一个 python 程序,其中有一个类似于以下列表的列表:

a = [[1,2,3], [4,2,7], [5,2,3], [7,8,5]]

在这里,我想创建一个字典,使用每个子列表的中间值作为键,它应该看起来像这样:

b = {2:[[1,2,3], [4,2,7], [5,2,3]], 8: [[7,8,5]]}

我怎样才能做到这一点?

【问题讨论】:

    标签: python-3.x list dictionary list-comprehension python-3.6


    【解决方案1】:

    你可以这样做:

    a = [[1,2,3], [4,2,7], [5,2,3], [7,8,5]]
    
    b = {}
    
    for l in a:
      m = l[len(l) // 2]  # : get the middle element
      if m in b:
        b[m].append(l)
      else:
        b[m] = [l]
    
    print(b)
    

    输出:

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

    您还可以使用defaultdict 来避免循环中的if

    from collections import defaultdict
    b = defaultdict(list)
    
    for l in a:
      m = l[len(l) // 2]
      b[m].append(l)
    
    print(b)
    

    输出:

    defaultdict(<class 'list'>, {2: [[1, 2, 3], [4, 2, 7], [5, 2, 3]], 8: [[7, 8, 5]]})
    

    【讨论】:

    • 谢谢!做到了。我们也可以通过列表推导来做到这一点吗??
    • 它可以使用dict理解来完成,但速度较慢。
    【解决方案2】:

    这是一个使用字典理解的解决方案:

    from itertools import groupby
    
    a = [[1,2,3], [4,2,7], [5,2,3], [7,8,5]]
    
    def get_mid(x):
        return x[len(x) // 2]
    
    b = {key: list(val) for key, val in groupby(sorted(a, key=get_mid), get_mid)}
    
    print(b)
    

    【讨论】:

    • [I for I in value] 可以稍微缩短为 list(value),如果你将 lambda 移到一个名为 get_middle_value 的单独函数中,那么代码 groupby(a, middle_value) 会读起来很漂亮。
    • 谢谢,@TadhgMcDonald-Jensen。我对其进行了一些清理,但我偏爱 lambda,以使其保持单线。
    • 很公平,doc for groupby 并在阅读后提醒我,当具有相同中间元素的元素不连续时,这可能会出现问题 a = [[1,1,1], [2,2,2], [3,1,3]] 将省略第一个元素。这可以通过调用sorted 来解决,但应该使用相同的键功能,因此将其移出而不是复制它是有意义的。 ;)
    • Touché,我已经修补了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2011-07-04
    • 2016-01-26
    相关资源
    最近更新 更多