【问题标题】:Sort a python dictionary into slots of equal intervals将python字典排序到等间隔的槽中
【发布时间】:2021-12-25 05:30:03
【问题描述】:

我们如何根据字典键对字典进行排序,并将它们置于一致的区间内?

例如,我们在python中有如下字典

{0: 1, 10: 3, 12: 2, 19: 4, 35: 5}

所以在上面的例子中,我们有来自0 - 35 的键,我们希望将它们放在 10 的间隔中,这意味着如下:

interval 0-10 has values 1
interval 10-20 has values [3, 2, 4]
interval 20-30 has no values
interval 30-40 has values [5]

最终的输出应该是这样的:

{0: [1], 10: [3, 2, 4], 20: [0/null], 30: [5]

有什么pythonic的方法吗?

【问题讨论】:

  • @PedroMaia 我不确定如何将间隔作为键,但您的解决方案是正确的。如果它是一个two-digit 数字,我们可以将它除以10,得到第一个整数,然后乘以10。喜欢你的想法,谢谢
  • @PedroMaia 如果我们想在最终输出中包含缺失的间隔。让我们在这里说:20: [0 or null]。我能想到的一种方法是,一旦我们得到输出,再次遍历字典键并找到缺失的值?我们能以更好的方式做到这一点吗?

标签: python sorting dictionary


【解决方案1】:

使用collections.defaultdict

from collections import defaultdict

data = {0: 1, 10: 3, 12: 2, 19: 4, 35: 5}
output = defaultdict(list)
for k, v in data.items():
    output[k // 10 * 10].append(v)

>>> dict(out)
{0: [1], 10: [3, 2, 4], 30: [5]}

编辑

如果您必须在结果字典中包含所有键,则将默认字典替换为自行构建键的字典:

out = {k: [] for k in (range(0, (max(data)//10*10)+1, 10))}
for k, v in data.items():
    out[k // 10 * 10].append(v)

【讨论】:

  • 谢谢@Jab,有没有办法在没有第二个循环的情况下在同一迭代中包含空间隔?
  • 请看我的编辑。
  • 这样比较好。
  • 我认为它是max(data)//10 * 10
  • 不。应该是这样,所以它的数量是正确的,但它有最终情况,所以正确的是:(max(data) // 10 * 10) + 1
【解决方案2】:

要添加缺失值,可以使用 last 存储一个变量,并检查它们之间的差距是否大于 10:

a = {0: 1, 10: 3, 12: 2, 19: 4, 35: 5}
out = {}
last = 0
for i in a:
    b = int(i/10) * 10
    if (b - last) > 10:
        out[b-10] = [] # whatever you want it to be
    if b in out:
        out[b].append(a[i])
    else:
        out[b] = [a[i]]
    last = b

输出:

{0: [1], 10: [3, 2, 4], 20: [], 30: [5]}

【讨论】:

  • 酷,不过再检查一次。如果我们有以下输入:{0: 1, 10: 3, 12: 2, 19: 4, 45: 5},那么输出将是{0: [1], 10: [3, 2, 4], 30: [], 40: [5]},但不是{0: [1], 10: [3, 2, 4], 20: [], 30:[], 40: [5]}
猜你喜欢
  • 2012-07-18
  • 2013-05-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2017-01-03
  • 1970-01-01
  • 2018-01-10
相关资源
最近更新 更多