Преобразовать словарь Python в верхний регистр - PullRequest
0 голосов
/ 24 апреля 2018

По какой-то причине мой код отказывается конвертировать в верхний регистр, и я не могу понять, почему. Я пытаюсь затем записать словарь в файл со значениями словаря в верхнем регистре, вводимых в своего рода файл шаблона.

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

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Вы не должны изменять элементы словаря, поскольку вы перебираете их. Состояние документы :

Итерации при добавлении или удалении записей в словаре могут поднять 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 .

0 голосов
/ 24 апреля 2018

В Python 3 вы не можете сделать это:

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

, потому что он изменяет словарь, итерируя по нему, а Python этого не позволяет (не с Python 2, потому что items() возвращает копия элементов).Кроме того, даже если бы это работало, оно сохраняло бы старые ключи (также: очень медленно создавать словарь на каждой итерации ...)

Вместо этого перестраивайте свой dict в понимании dict:

newDict = {k.upper():v.upper() for k,v in newDict.items()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...