如何根据其他键名对字典中的键(由数字组成)进行排序或更改?

时间:2019-02-27 14:43:44

标签: python dictionary

我有一个从JSON加载的字典,就像这样:

data = {
    "1": [
        "data",
        "data"
    ],
    "2": [
        "data",
        "data"
    ],
    "3": [
        "data",
        "data"
    ]
    "5": [
        "data",
        "data"
    ]
}

在这种情况下,缺少“ 4”,因为它已通过另一个功能删除。

我正在尝试编写一个可以对字典进行重新组织/排序的函数。这涉及固定这样的孔。在这种情况下,数字应该从1到4且没有孔,这意味着将键名5更改为4。

我写了一些代码来找出丢失的号码:

nums = [1, 2, 3, 5]
missing= 0
for x in range(len(data)):
    if x not in nums and x is not 0:
        missing += x

非常感谢您的帮助。我只是停留在如何进行上。

PS:我意识到这可能不是最佳的数据结构。这样,我可以轻松地将作为系统参数给出的整数与键进行匹配,从而找到相应的值。

所以我只是想出一种非常简单的方法...比我想象的要简单得多。

for x in range(len(data)):
    for k, v in data.items():
        data[x] = data.pop(k)
        break

1 个答案:

答案 0 :(得分:0)

您可以使用enumerate来获取现有(已排序)键的新索引:

>>> data = {"1": ["data11", "data12"],
...         "2": ["data21", "data22"],
...         "3": ["data31", "data32"],
...         "5": ["data51", "data52"]}
...
>>> {i: data[k] for i, k in enumerate(sorted(data), start=1)}
{1: ['data11', 'data12'],
 2: ['data21', 'data22'],
 3: ['data31', 'data32'],
 4: ['data51', 'data52']}

或者就地使用(实际上if i != k:并不是必需的,但是可能更快):

>>> for i, k in enumerate(sorted(data), start=1):
...     if i != k:
...         data[i] = data.pop(k)
...
>>> data
{1: ['data11', 'data12'],
 2: ['data21', 'data22'],
 3: ['data31', 'data32'],
 4: ['data51', 'data52']}