【问题标题】:How to change a dictionary's key in Python using method Pop?如何使用方法 Pop 在 Python 中更改字典的键?
【发布时间】:2020-10-25 06:16:29
【问题描述】:

嗯,我有一本字典,用于存储从 PDF 文件中提取的信息。 像这样:

{ 'B) NAME:': 'Jair', 'H) AGE: ': '25', 'J) Gender': '男性'}

我正在尝试通过使用以下代码排除来自 PDF 的字符串“b)”、“h)”、“j)”来“清理”该字典:

for k in mydict:
  mydict[(k.split(')')[1])] = mydict.pop(k)

但此代码不起作用:“IndexError: list index out of range”

我不知道为什么,因为当我用 print 而不是 pop 运行代码时,一切都很顺利:

for k in mydict:
        print(k.split(')')[1])

我应该改变什么?

【问题讨论】:

标签: python dictionary


【解决方案1】:

您不能在迭代字典的同时向字典添加元素或从字典中删除元素。你正在做这两件事。你最好的方法是这样的:

new_dict = {}
for key, value in mydict.items():
    new_dict[k.split(')')[1]] = value
mydict = new_dict

如果您对字典理解感到满意:

mydict = {k.split(')')[1]: value for key, value in mydict.items()}

创建一个新字典,然后将其分配给mydict

【讨论】:

  • 我能够运行有问题的代码而没有任何错误,是吗?
  • 见上面的评论。改变对象时不要迭代它。 docs.python.org/3/tutorial/controlflow.html#for-statements
  • 好的,谢谢,但我的问题是我没有收到 OP 得到的错误,这是为什么呢?
  • @python_learner。文档几乎说它是不可预测的。它可能会做正确的事情。它可能会给出运行时错误。它可能无法迭代某些项目。因为它适用于一本小字典并不意味着它适用于一本大字典。因为它适用于一个版本的 Python,所以它不适用于每个版本的 Python。 docs.python.org/3/library/stdtypes.html#dict-views。请参阅iter(dictview)
【解决方案2】:

假设

d = { 'B) NAME:': 'Jair', 'H) AGE: ': ' 25', 'J) Gender': 'Male'}

一个简单的基于正则表达式的解决方案,带有字典理解(创建新的字典)

{re.findall(".*\)\s(.*)", k)[0]: d[k] for k in d.keys()}

您还可以使用下面的代码块(在 try/except 中捕获运行时错误)来更改现有的字典。

for k in d.keys():
    new_key = re.findall(".*\)\s(.*)", k)[0]
    d[new_key] = d[k]
    del d[k]

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多