【问题标题】:Shifting dictionary elements移动字典元素
【发布时间】:2015-05-05 05:49:42
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 看起来您应该使用的数据结构是列表,而不是字典。
  • 无论您使用dict的原因是什么,您最好重新考虑您的问题,改用list,这样可以省去很多麻烦。

标签: python


【解决方案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

【讨论】:

    【解决方案2】:

    使用 list 代替可变的 0 基索引元素序列:

    trans_list = [ "Charlie", "Alan", "Jake", "Rose" ]
    del_key = raw_input('What key to delete')
    del trans_list[int(del_key)]
    

    【讨论】:

      【解决方案3】:

      由于definition of a dictionary,您不能这样做:

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

      您可能想使用list 来订购一些东西。

      但是,您可以从字典中获取列表并对其进行排序,然后您就可以按照自己的喜好重新排序。见How can I convert a Python dictionary to a list of tuples?

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-11-02
          • 1970-01-01
          • 2017-07-10
          • 1970-01-01
          • 1970-01-01
          • 2018-09-21
          • 2021-04-19
          • 2016-02-27
          • 2018-08-05
          相关资源
          最近更新 更多