【问题标题】:Compare keys of dictionary with list将字典的键与列表进行比较
【发布时间】:2017-06-21 10:01:12
【问题描述】:

我有一个数字列表(比如 A)。例如:

A = [ 0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7]

列表 A 的许多元素都有与之关联的列表,我将结果以字典的形式存储。这个字典的键总是属于列表 A 的元素。例如,

D = {0.5: [1, 2], 0.7: [1, 1], 0.3: [7, 4, 4], 0.6: [5]}

在本例中,元素 0.50.70.30.6 附有列表,这些元素作为字典 D 中的键。

对于 A 中没有附加列表的元素( 0.10.20.3),我想将它们附加到字典 D(并为它们分配空列表)并创建一个新字典 D_new。例如,

D_new = {0.1: [], 0.2: [], 0.4: [], 0.5: [1, 2], 0.7: [1, 1], 
          0.3: [7, 4, 4], 0.6: [5]}

【问题讨论】:

  • 使用浮点值作为字典键通常是个坏主意。大多数浮点运算本质上是不精确的,所以你会得到像 KeyErrorD_new[0.1+0.2] 这样的惊喜,因为 0.1+0.2 不完全是 0.3

标签: python list dictionary


【解决方案1】:

使用 dict-comprehension,遍历 A 中的值,使用 D.get()D 中查找它们,默认为 []

D_new = { x: D.get(x, []) for x in A }

【讨论】:

  • 太棒了!我喜欢这个解决方案
【解决方案2】:

你也可以从 D:

创建一个 defaultdict
from collections import defaultdict
D_new = defaultdict(list, D)

# the key in D returns corresponding value
D_new[0.5]
# [1, 2]

# the key not in D returns empty list
D_new[0.2]
# []

【讨论】:

    【解决方案3】:

    你可以使用dict.setdefault:

    D = {0.5: [1, 2], 0.7: [1, 1], 0.3: [7, 4, 4], 0.6: [5]}
    A = [ 0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7]
    
    for a in A:
        _ = D.setdefault(a, [])
        #                   ^ add's empty list as value if `key` not found
    

    终值:

    >>> D
    {0.5: [1, 2], 0.1: [], 0.2: [], 0.3: [7, 4, 4], 0.6: [5], 0.4: [], 0.7: [1, 1]}
    

    注意:它不是创建新的dict,而是修改现有的dict。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 2019-03-24
      • 2022-09-23
      • 2018-10-05
      相关资源
      最近更新 更多