Python - 寻找一种更有效的方法来重新编写字典中的键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - 寻找一种更有效的方法来重新编写字典中的键相关的知识,希望对你有一定的参考价值。

这是我目前的字典:

{0: [(1,1.0)],
1: [(132,1.0)],
2: [(2000,1.0)],
3: [(234,1.0)]}

现在,有些情况下我可能不得不放弃这些键。让我们以2为例,结果字典看起来像这样:

{0: [(1,1.0)],
1: [(132,1.0)],
3: [(234,1.0)]}

现在,我想重新编号键,使它们一直增加1:

{0: [(1,1.0)],
1: [(132,1.0)],
2: [(234,1.0)]}

我的第一个想法是循环遍历字典并替换键,但考虑到我的实际字典有2000个键,这似乎不是最有效的路径。

有更有效的方法吗?

答案
D = dict(enumerate(D[x] for x in sorted(D)))

但请使用清单。它由数字索引并自动重新编号:

>>> L = [
...    [(1,1.0)],
...    [(132,1.0)],
...    [(2000,1.0)],
...    [(234,1.0)]
... ]
>>> del L[1]
>>> print(L)
[
    [(1,1.0)],
    [(2000,1.0)],
    [(234,1.0)]
]

你可以使用L = [D[x] for x in sorted(D)]将你的dict转换为一个列表并使用D = dict(enumerate(L))转换回你的dict格式

这可以是一个解决方案:

D = dict(enumerate(D[x] for x in sorted(D)))

但最好只使用列表。

另一答案
>>> current = {0: [(1,1.0)],
...      1: [(132,1.0)],
...      3: [(234,1.0)]}

>>> new_dict = {}
>>> for i,key in enumerate(sorted(original.keys())):
...     new_dict[i] = a[key]

>>> new_dict
{0: [(1,1.0)],
 1: [(132,1.0)],
 2: [(234,1.0)]}
另一答案

可能值得一试可能用OrderedDict来解决你的问题

from collections import OrderedDict
d={0: [(1,1.0)],
1: [(132,1.0)],
3: [(234,1.0)],
-1:[(234,1.0)]} # added out of order case

od =OrderedDict(sorted(d.items()))

dict(zip(range(len(od)),od.values()))

输出:

{0: [(234, 1.0)], 1: [(1, 1.0)], 2: [(132, 1.0)], 3: [(234, 1.0)]}

以上是关于Python - 寻找一种更有效的方法来重新编写字典中的键的主要内容,如果未能解决你的问题,请参考以下文章

如何为网站编写高效的计数器

为啥一种方法比另一种更有效?

有没有一种更有效的方法来枚举python或R中离散随机变量的每个可能结果的概率?

寻找一种更有效(和可移植)的方式在 unix 中获取(数字)文件权限

一种更有效的方法来总结 postgres 中列之间的差异?

使用 C# 检测破坏性 SQL 查询