Python - в поисках более эффективного способа перенумерации ключей в моем словаре - PullRequest
0 голосов
/ 29 августа 2018

Вот мой текущий словарь:

{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 ключей.

Есть ли более эффективный способ?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Возможно, стоит попробовать решить проблему с 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)]}
0 голосов
/ 29 августа 2018
>>> 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)]}
0 голосов
/ 29 августа 2018
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))

Так что это может быть решением:

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

Но лучше сначала использовать список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...