移动字典元素

时间:2015-03-04 09:42:09

标签: python

我有一个未定义大小的字典(与用户想要的一样大)但是我希望能够在需要时删除字典中的项目,我的问题是如何移动所有字典键一旦被删除删除,即

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个元素大。

由于

4 个答案:

答案 0 :(得分:6)

为此,您应该使用列表而不是字典,因为列表是本地将数字索引映射到元素的结构。使用del transList[delkey]从列表中删除元素时,它会自动将列表中的剩余元素向下移动以保持连续索引。

答案 1 :(得分:1)

由于definition of a dictionary

,您无法做到这一点
  

最好将字典视为键的无序集:值对

您可能希望使用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)]