Python

Pyhon обычный перебор

Здравствуйте, как мне пройтись по такому эллементу и изменить нужные мне значения, а то я пройтись могу. а вот собрать обратно в такой же эллемент чет не получается.

myDict = {"One" : [ {"Lol": 1}, {"Lol": 2} ], "Two" : [ {"Kek": 1}, {"Kek": 2} ] }

вот , нужно все слова , ключи , и значения проверить, чтобы небыло слова "o" например. И собрать в такое же состояние myDict но "o" поменять на "а"
Askar Abdirov
Askar Abdirov
6
Не хотелось пересобирать новый объект, можно было на месте создавать новые ключи и удалять старые. А оказ-ца питон выдает ошибку, если в цикле удалять ключи.

В таком случае очень хочется считерить - превратить объект в строку, тупо заменить в строке все `o` на `a` и снова полученную строку сделать словарем.
 import json
import re

myDict = {"Oneo" : [ {"Lol": 1}, {"Lol": 2} ], "Two" : [ {"Kek": 1}, {"Kek": 2} ] }

string = json.dumps(myDict)

def replacer(re_match):
return re_match.group(0).replace('o', 'a').replace('O', 'A')

string = re.sub(r'".*?o.*?"\s*:', replacer, string, flags=re.IGNORECASE)

myDict = json.loads(string)

print(myDict)
Хотя можно и руками пересобрать. Ну это писец.
 def replace(key): 
return key.replace('o', 'a').replace('O', 'A')

def moo(old, new):

for key in old:
new_key = replace(key)
new[new_key] = []

for dict_ in old[key]:
new_dict = dict()
new[new_key].append(new_dict)

for key2 in dict_:
new_key2 = replace(key2)
new_dict[new_key2] = dict_[key2]

return new

###
myDict = {"Oneo" : [ {"Lol": 1}, {"Lol": 2} ], "Two" : [ {"Kek": 1}, {"Kek": 2} ] }
newDict = moo(myDict, dict())

print(myDict)
print(newDict)
Вложение не глубокое - сделал цикл в цикле, иначе легче было бы написать хитрую рекурсию.
Юрий Сычев
Юрий Сычев
62 360
Лучший ответ
Dauren Aleshov А зачем replacer, если нужно просто о на а поменять?
 re.sub('o', 'a', string, flags=re.IGNORECASE)) 
Askar Abdirov Спасибо , за ответ. Но все таки, есть причина почему мне надо пройтись по каждому эллементу и пересобрать обьект. У меня в обьекте есть байт код. То что Вы сделали, оно не подойдет.
Askar Abdirov Ой не заметил 2 часть ответа, сейчас гляну. Спасиб =)
Askar Abdirov Круто, я не Python программист, но вы крутой =) надеюсь это мне поможет в моем задании )
Askar Abdirov Оке, разберусь. Пасиб! =)
 import re

def repl(s):
return re.sub(('o'),
lambda x: 'Aa'[x[0].islower()],
s,
flags=re.I) \
if isinstance(s, str) else s

def foo(d):
res = dict()
for key in d:
if isinstance(d[key], list):
res[repl(key)] = [foo(x) for x in d[key]]
elif isinstance(d[key], str):
res[repl(key)] = repl(d[key])
else:
res[repl(key)] = d[key]
return res
> foo(myDict)
> {'Ane': [{'Lal': 1}, {'Lal': 2}], 'Twa': [{'Kek': 1}, {'Kek': 2}]}

Не рассмотрены варианты, когда ключи не являются строками.
Valera Selenkov
Valera Selenkov
22 178