我有一个未定义大小的字典(与用户想要的一样大)但是我希望能够在需要时删除字典中的项目,我的问题是如何移动所有字典键一旦被删除删除,即
transDict={0:"Charlie", 1:"Alan", 2:"Jake", 3:"Rose"}
delkey = raw_input('What key to delete')
transDict[delkey] = transDict.pop[int(delkey + 1)]
# this is the bit isn't working code just an
# example of the functionality I need
for _id in transDict.keys(int(delkey) + 1:):
transDict[_id] = transDict[(int(_id) + 1)]
然后我需要将所有其他元素从3开始向下移动一步,我的问题是字典可以是5或50个元素大。
由于
答案 0 :(得分:6)
为此,您应该使用列表而不是字典,因为列表是本地将数字索引映射到元素的结构。使用del transList[delkey]
从列表中删除元素时,它会自动将列表中的剩余元素向下移动以保持连续索引。
答案 1 :(得分:1)
最好将字典视为键的无序集:值对
您可能希望使用list
来订购某些内容。
但是,您可以从字典中获取列表并对其进行排序,然后您就可以重新排序。请参阅How can I convert a Python dictionary to a list of tuples?。
答案 2 :(得分:1)
你绝对应该使用list
这样的功能,它将处理每个设计的功能。
>>> for i in l:
... print(l.index(i), i)
...
(0, 'Charlie')
(1, 'Alan')
(2, 'Jake')
(3, 'Rose')
>>> del l[2]
>>> for i in l:
... print(l.index(i), i)
...
(0, 'Charlie')
(1, 'Alan')
(2, 'Rose')
但为了回答你的问题,这是一个解决方案:
>>> def remove_key(d, del_key):
... new_dict = {}
... for key, val in d.items():
... if key < del_key:
... new_dict[key] = val
... elif key > del_key:
... new_dict[key-1] = val
... else: # key == del_key
... continue
... return new_dict
...
>>> transDict={0:"Charlie", 1:"Alan", 2:"Jake", 3:"Rose"}
>>> remove_key(transDict, 2)
{0: 'Charlie', 1: 'Alan', 2: 'Rose'}
您的算法出了什么问题:
for _id in transDict.keys(int(delkey) + 1:):
transDict[_id] = transDict[(int(_id) + 1)]
就是这样,
keys()
方法的参数中使用范围语法。正确的语法是使用[]
运算符,例如 .keys()[2:]
,delkey+1
开始的所有索引,丢弃这两种可能性,并且您将以下所有值都移动一个:
dict
的定义),因此,为了构建我建议的算法,我正在构建一个新的字典,并且在将密钥从第一个字典复制到新字典时,我考虑以下三种情况:
然后你可以将新词典分配给旧词典。
HTH
答案 3 :(得分:0)
使用list
代替0-base-indexed元素的可变序列:
trans_list = [ "Charlie", "Alan", "Jake", "Rose" ]
del_key = raw_input('What key to delete')
del trans_list[int(del_key)]