2015-02-11 70 views
2

我有一本我正在使用的字典。我偶尔会从中删除值,然后不得不返回并重命名键。我完成重命名,像这样:在删除项目后重命名字典键的更好方法是什么?

TestDic = {0: "Apple", 2: "Orange", 3: "Grape"} 
print(TestDic) 
TempDic = {} 
i = 0 
for Key, DictValue in TestDic.iteritems(): 
    TempDic[i] = DictValue 
    i += 1 
TestDic= TempDic 
print(TestDic) 

输出:

{0: 'Apple', 1: 'Orange', 2: 'Grape'} 

大。现在有更好的方法吗?我看到了this,但我无法弹出旧密钥,因为旧密钥/值对已消失。 this处理重新格式化字典中的int/float。

+5

是否有任何理由使用'dict',而不是一个'列表'? – seppo0010 2015-02-11 02:02:39

回答

3

改为使用列表。如果你的钥匙是连续整数,引用内容将是反正一样的,你不会有乱有关重命名键:

>>> data = ["Apple", "Gooseberry", "Orange", "Grape"] 
>>> data[0] 
'Apple' 
>>> data[1] 
'Gooseberry' 
>>> data[2] 
'Orange' 
>>> data[3] 
'Grape' 
>>> data.remove("Gooseberry") 
>>> data 
['Apple', 'Orange', 'Grape'] 
>>> data[0] 
'Apple' 
>>> data[1] 
'Orange' 
>>> data[2] 
'Grape' 
>>> 
+0

我正在使用变量变量,并且完全归于使用字典 - 已经有很多代码。我的小功能可行,但我只是想知道是否有更好的方法,如果有人使用字典。如果我重写这条路,我会考虑使用一个列表,但是改变这一点是不可能的。字典可能是一个不好的选择,但我想这对我来说是未来使用的奖励。谢谢。 – JayJay123 2015-02-11 02:22:49

+1

什么是“变量变量”? – kindall 2015-02-11 02:29:46

+0

@ JayJay123如果你是指我认为你的意思是“变量变量”,你可能想阅读[this](http://stupidpythonideas.blogspot.com/2013/05/why-you-dont-want-to-动态create.html上)。 – 2015-02-11 02:44:40

2

如果你真的想坚持使用字典,你可以做你希望这样的,它不需要创建一个临时的字典(虽然它创建一个临时目录):

testdic = {0: "Apple", 1: "Blueberry", 2: "Orange", 3: "Grape"} 
print(testdic) 

delkey = 1 # key of item to delete 
del testdic[delkey] 
print(testdic) 

# go through dict's items and renumber those affected by deletion 
for key, value in testdic.iteritems(): 
    if key > delkey: # decrement keys greater than the key deleted 
     testdic[key-1] = value 
     del testdic[key] 

print(testdic) 

输出:

{0: 'Apple', 1: 'Blueberry', 2: 'Orange', 3: 'Grape'} 
{0: 'Apple', 2: 'Orange', 3: 'Grape'} 
{0: 'Apple', 1: 'Orange', 2: 'Grape'} 
+0

一个小小的nits-1:'sorted()'必须在将它排序之前将'testdic.iteritems()'转换成列表,所以你不妨使用'testdic.items()'(实际上它应该稍微快一些),2:不需要'key = itemgetter(0)':无论如何,元组将按照字典顺序排序。 – 2015-02-11 03:09:11

+0

@零:你不需要排序(或使用'itemgetter'来完成),但仅仅是因为顺序无关紧要(因为元组无论如何都会被排序 - 它们不会自字典是无序的)。 – martineau 2015-02-11 03:19:40

+0

我想我一定表达得很糟糕;我的意思是,如果你*排序,不需要'key = itemgetter(0)',因为元组之间的比较是字典式的,并且在其他任何事情之前自动比较't [0]'。恰巧,因为所有正整数都是“hash(n)== n”,所以它很可能(但除非所有其他代码按照“正确”顺序插入项目)被命令“自然地”,但是这真的变成了细节。正如你所说,但实际上这并不是必要的,所有这些都是挑剔的:-) – 2015-02-11 03:33:05