将Python字典转换为大写形式

9

由于某些原因,我的代码无法转换为大写字母,我无法弄清楚原因。我试图将字典写入文件,并将大写字典值输入到一种模板文件中。

#!/usr/bin/env python3
import fileinput
from collections import Counter


#take every word from a file and put into dictionary
newDict = {}
dict2 = {}
with open('words.txt', 'r') as f:
        for line in f:
            k,v = line.strip().split(' ')
            newDict[k.strip()] = v.strip()
print(newDict)
choice = input('Enter 1 for all uppercase keys or 2 for all lowercase, 3 for capitalized case or 0 for unchanged \n')
print("Your choice was " + choice)

if choice == 1:
    for k,v in newDict.items():
        newDict.update({k.upper(): v.upper()})
if choice == 2:
    for k,v in newDict.items():
        dict2.update({k.lower(): v})


#find keys and replace with word

print(newDict)
with open("tester.txt", "rt") as fin:
    with open("outwords.txt", "wt") as fout:
        for line in fin:
            fout.write(line.replace('{PETNAME}', str(newDict['PETNAME:'])))
            fout.write(line.replace('{ACTIVITY}', str(newDict['ACTIVITY:'])))

myfile = open("outwords.txt")
txt = myfile.read()
print(txt)
myfile.close()

让我猜猜:你遇到了“迭代过程中字典发生改变”的问题? - Jean-François Fabre
2个回答

22

在Python 3中,你不能这样做:

for k,v in newDict.items():
    newDict.update({k.upper(): v.upper()})

因为在迭代字典时修改字典会导致Python报错(这在Python 2中不会发生,因为items()方法返回的是元素的副本,而不是引用)。此外,即使可以正常运行,也会保留旧的键(同时:每次迭代创建一个新字典也非常慢...)

相反,可以使用字典推导式重新构建字典:

newDict = {k.upper():v.upper() for k,v in newDict.items()}

为什么 newDict 不够用?我尝试了你的解决方案,当然它可以工作,但我只是好奇不带 .items() 的版本为什么不能工作。 - Soren V. Raben
1
因为只有 newDict,循环会遍历键而不是键/值元组。 - Jean-François Fabre
好的,我猜这是因为myDict.keys()只适用于键,myDict.values()只适用于值,而myDict.items()适用于键/值元组?顺便问一下 - 是否有可能在不循环的情况下将字典键大写? - Soren V. Raben
@Konrad 确实如此。.keys()并不是非常有用,因为在myDict上进行迭代/测试具有相同的效果。对于“是否可能在不循环的情况下将字典键大写?”=>您必须在每个键上应用upper(),因此答案是否定的。 - Jean-François Fabre

3
您在迭代字典项时不应更改它们。文档指出:

在添加或删除字典中的条目时迭代视图可能会引发RuntimeError或无法迭代所有条目。

一种根据需要更新字典的方法是使用for循环弹出值并重新分配。例如:
d = {'abc': 'xyz', 'def': 'uvw', 'ghi': 'rst'}

for k, v in d.items():
    d[k.upper()] = d.pop(k).upper()

print(d)

{'ABC': 'XYZ', 'DEF': 'UVW', 'GHI': 'RST'}

另一种选择是使用字典推导,如@Jean-FrançoisFabre所示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接