【问题标题】:Building a dictionary with lists as values using list comprehension使用列表推导构建以列表为值的字典
【发布时间】:2020-12-11 11:27:23
【问题描述】:

我正在尝试使用 list/dict comprehension 简化以下代码,我想在其中从列表构建列表字典。

在本例中,我将每个项目的 mod(或任何其他功能)作为键。如果字典中不存在该键,则创建一个新列表并将该项目附加到列表中,否则直接附加该项目。

def get_key(val):
    return val % 3 # Can be something else, it doesn't matter


dict = {}
data = [i for i in range(10)]
for item in data:
    key = get_key(item)
    if key in dict:
        dict[key].append(item)
    else:
        dict[key] = [item]
print(dict)

预期输出

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

为了简化上面的代码,我尝试了这种丑陋的做法:

for item in data:
    key = get_key(item)
    dict[key] = [item] if key not in dict else (dict[key], dict[key].append(item))[0]

但是,如何在没有 for 循环的情况下使用 list/dict 理解作为单个表达式来实现相同的目标?

我可以想到这样的事情,但它无法将值附加到预先存在的列表中。

{get_key(item):[item] for item in data}

相关帖子:

【问题讨论】:

    标签: python dictionary list-comprehension


    【解决方案1】:

    创建一个值列表,每个子列表的第一个元素是键 [n] +,然后使用它来创建字典。

    m = [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]
    
    dictt = {i[0]:i[1:] for i in m}
    print(dictt)
    
    >>> {0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}
    

    全部在一行

    dictt = {i[0]:i[1:] for i in [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]}
    

    【讨论】:

      【解决方案2】:

      你很接近。下面是我使用字典理解的方法

      data = list(range(0,10))
      mod= 3
      {i:data[i::mod] for i in range(mod)}
      

      出来

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

      【讨论】:

      • 谢谢。如果键由 mod 确定,此方法适用于递增连续整数列表的数据。但是当密钥由其他规则确定时,它不能推广到其他情况。我已经更新了我的问题以使其更清楚。
      【解决方案3】:

      您在这里并不需要列表/字典理解。只需使用带有defaultdict 的普通循环即可:

      out = collections.defaultdict(list)
      for i in range(10):
          out[i % 3].append(i)
      

      【讨论】:

      • 感谢您的回答。实际上它有效,但我正在寻找使用列表/字典理解的单一表达式解决方案。
      【解决方案4】:

      试试default dict

      from collections import defaultdict
      
      d = defaultdict(list)
      for item in range(10): 
          d[item % 3].append(item)
      

      【讨论】:

        猜你喜欢
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2016-02-04
        • 2018-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多