簡體   English   中英

如何將字典的鍵值從隨機數更改為連續整數?

[英]How to change the key values of dictionary from random numbers to consecutive integers?

我有一本像

dict1 = {1 : {'objects_1' : [1289,12678]} , 6 : {'objects_2' : [7798,808]} , 8 : ['object_2' : [76789,879]} }

基本上,dict1.keys() 是 1,6,8,10,15,...100 有沒有辦法用從 1,2,3,4,5..100 開始的連續整數重新分配這些值

我建議使用字典理解和enumerate重新創建字典。

new_dict = { index: val for index, ( _, val ) in enumerate( old_dict.items() ) }

所以你需要做的是 go 超過字典項目。 您可以通過使用keys()方法迭代keys來做到這一點。

然后你可以為每次迭代創建一個枚舉器。 您可以使用enumerate()來做到這一點。 如果您未聲明任何內容或從 start 參數開始, enumerate()有自己的值從 0 開始。

因此,對於每次迭代,現在您都擁有枚舉值和密鑰。 您可以使用枚舉值作為鍵為字典分配一個新鍵,並將pop()方法的結果作為您每次使用的特定鍵的結果。

代碼示例:

dict1 = {1 : {'objects_1' : [1289,12678]} , 6 : {'objects_2' : [7798,808]} , 8 : {'object_2' : [76789,879]} }

print(dict1)

for enum, i in enumerate(dict1.keys(), 1):
    print (enum, i)

    dict1[enum] = dict1.pop(i)

print(dict1)

根據瘋狂物理學家的評論進行編輯,感謝您提醒我

創建一個新字典並將dict1.values()復制到它。

new_dict = {}

for key,value in enumerate(dict1.values(),1):
    new_dict[key] = value

# Output:
# new_dict = {1: {'objects_1': [1289, 12678]}, 2: {'objects_2': [7798, 808]}, 3: {'object_2': [76789, 879]}}

不需要使用任何顯式的 for 循環來實現這一點。 我們可以簡單地利用zip並在兩個可迭代對象之一用盡時自行停止。 我們也可以創建一些任意大range ,因為它也不是全部存儲在 memory 中。

dict(zip(range(1, 1_000), dict1.values()))

{1: {'objects_1': [1289, 12678]},
 2: {'objects_2': [7798, 808]},
 3: {'object_2': [76789, 879]}}

免責聲明:這將在 Python 3.7+ 中按預期工作,因為dict現在按插入順序保留項目。 否則我們將不得不使用OrderedDict

假設您想就地更新字典,我不會對鍵的插入順序做出任何假設。

dict1 = {8 : {'objects_1' : [1289,12678]} , 6 : {'objects_2' : [7798,808]} , 1 : {'object_2' : [76789,879]} }
old_keys = list(dict1.keys())
for idx in range(1, len(old_keys) + 1):
    if idx in old_keys:
        old_keys.remove(idx)
    else:
        old_key = old_keys.pop(0)
        dict1[idx] = dict1.pop(old_key)
print(dict1)

印刷:

{1: {'object_2': [76789, 879]}, 2: {'objects_1': [1289, 12678]}, 3: {'objects_2': [7798, 808]}}

當然,這可以更改的插入順序,但可以處理任意輸入。

如果您正在運行 Python 3.7(或 CPython 3.6)或更高版本,其中假設set維護插入順序並且其pop方法將刪除插入順序中的項目,那么您可以使用:

dict1 = {0 : {'objects_1' : [1289,12678]} , 1 : {'objects_2' : [7798,808]} , 2 : {'object_2' : [76789,879]} }
old_keys = set(dict1.keys())
for idx in range(1, len(old_keys) + 1):
    if idx in old_keys:
        old_keys.remove(idx)
    else:
        old_key = old_keys.pop()
        dict1[idx] = dict1.pop(old_key)
print(dict1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM