将python字典转换为大写

Posted

技术标签:

【中文标题】将python字典转换为大写【英文标题】:Convert python dictionary to uppercase 【发布时间】:2018-10-04 20:53:09 【问题描述】:

由于某种原因,我的代码拒绝转换为大写,我不知道为什么。我试图然后将字典写入一个文件,其中大写字典值被输入到一种模板文件中。

#!/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()

【问题讨论】:

让我猜猜:你得到“迭代期间的字典更改”? 【参考方案1】:

在 python 3 中你不能这样做:

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

因为它在迭代字典时会更改字典,而 python 不允许这样做(python 2 不会发生这种情况,因为 items() 曾经将元素的 copy 作为 @ 返回987654323@)。此外,即使它有效,它也会保留旧键(另外:在每次迭代时创建字典非常慢......)

相反,在字典理解中重建你的字典:

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

【讨论】:

为什么newDict 不够用?我尝试了您的解决方案,它当然可以,但我只是好奇为什么没有 .items() 的版本不起作用。 因为只有newDict 循环迭代键,而不是键/值元组 好吧,所以我猜这是因为myDict.keys() 仅用于键,myDict.values() 仅用于值,myDict.items() 用于键/值元组?顺便说一句 - 是否可以在不循环的情况下将字典键大写? @Konrad 完全正确。 .keys() 真的不是超级有用,因为在 myDict 上进行迭代/测试具有相同的效果。对于“是否可以在不循环的情况下将字典键大写?” => 你必须在每个键上应用 upper() 所以答案是否定的。【参考方案2】:

您不应该在迭代字典项时更改它们。 docs 状态:

在字典中添加或删除条目时迭代视图可能 引发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'

另一种方法是字典理解,如shown by @Jean-FrançoisFabre。

【讨论】:

以上是关于将python字典转换为大写的主要内容,如果未能解决你的问题,请参考以下文章

将列表列表转换为Python中的字典字典

python中如何将字符串转换为字典

Python - 如何将类似字典的字符串转换为字典[重复]

如何将 Python 字典转换为 JavaScript 哈希表?

如何将嵌套字典转换为 Python 元组?

将 Python 字典转换为 Pandas 数据框