Это мои входы
hand = {'*': 1, 'v': 2, 'n': 1, 'i': 1, 'l': 2}
string = 'abc'
Мне нужно заменить '*' каждым символом из строки и добавить новый словарь в список. Выход, который мне нужен, таков:
[{'v': 2, 'n': 1, 'i': 1, 'l': 2, 'a': 1}, {'v': 2, 'n': 1, 'i': 1, 'l': 2, 'b': 1}, {'v': 2, 'n': 1, 'i': 1, 'l': 2, 'c': 1}]
Это то, что я сделал, и это не работает. Я пробовал несколько разных подходов, но безуспешно.
del hand['*']
for x in string:
item = {x: 1}
newHand = hand
newHand.update(item)
print(newHand)
list.append(newHand)
newHand.pop(x)
print(list)
Вывод ниже - это то, чего я пытаюсь избежать:
{'v': 2, 'n': 1, 'i': 1, 'l': 2, 'a': 1, 'b': 1, 'c': 1}
Спасибо





Это создает просто новое имя для тех же данных:
newHand = hand
Вы всегда изменяете один и тот же словарь. Вы сохраняете ссылку в свой list (кстати, не используйте list в качестве имени переменной — вы затеняете встроенный list()).
Если вы напечатаете id() содержимого вашего списка, вы увидите, что все они одинаковы:
print( id(x) for x in list) # try that to see its the same object trice
Вместо этого вам нужно копировать данные, чтобы создать три отдельных словаря.
Вместо этого я решил обновить 1-элемент dict из вашего string и обновить их остатками hand после извлечения '*':
hand = {'*': 1, 'v': 2, 'n': 1, 'i': 1, 'l': 2}
s = hand.pop("*") # removes * and stores the calue
t = "abc"
# create a list of new dicts wich 1 elem each
l = [ {c:s} for c in t]
# update all inner dicts
for d in l:
d.update(hand) # add what is in hand left
print(l)
Выход:
[{'a': 1, 'i': 1, 'v': 2, 'l': 2, 'n': 1},
{'i': 1, 'b': 1, 'v': 2, 'l': 2, 'n': 1},
{'i': 1, 'c': 1, 'v': 2, 'l': 2, 'n': 1}]
Вы можете найти больше информации о копировании mutables здесь: Как клонировать или скопировать список?
Чтобы также обновить существующие ключи:
for d in l:
for thing in hand:
d.setdefault(thing,0) # create key if not exists and set to 0
d[thing] += hand[thing] # add hands value on top
Спасибо за помощь!
Изучив это решение, я столкнулся с проблемой. Если в t есть элемент, который также присутствует в руке, он не будет обновляться, а это то, чего я не хочу. Например, если t = aeiou, в одном элементе списка отсутствует символ 'i'.
3-й элемент без исходного «i» от руки:
[{'a': 1, 'v': 2, 'n': 1, 'i': 1, 'l': 2}, {'e': 1, 'v': 2, 'n': 1, 'i': 1, 'l': 2}, {'i': 1, 'v': 2, 'n': 1, 'l': 2}, {'o': 1, 'v ': 2, 'n': 1, 'i': 1, 'l': 2}, {'u': 1, 'v': 2, 'n': 1, 'i': 1, 'l ': 2}]
@SHR, у ваших первых данных не было этой проблемы. Я добавил ручное обновление ваших диктовок - вы можете использовать это со своей новой проблемой.
Я ценю ваше время.
Возможный дубликат Как клонировать или скопировать список? - та же проблема для списков - у вас есть dict , но принцип тот же...