Список словарей с разными ключами из строки символов

Это мои входы

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}

Спасибо

Возможный дубликат Как клонировать или скопировать список? - та же проблема для списков - у вас есть dict , но принцип тот же...

Patrick Artner 07.03.2019 17:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Спасибо за помощь!

SHR 07.03.2019 17:18

Изучив это решение, я столкнулся с проблемой. Если в t есть элемент, который также присутствует в руке, он не будет обновляться, а это то, чего я не хочу. Например, если t = aeiou, в одном элементе списка отсутствует символ 'i'.

SHR 07.03.2019 18:36

3-й элемент без исходного «i» от руки:

SHR 07.03.2019 18:41

[{'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 07.03.2019 18:41

@SHR, у ваших первых данных не было этой проблемы. Я добавил ручное обновление ваших диктовок - вы можете использовать это со своей новой проблемой.

Patrick Artner 07.03.2019 18:53

Я ценю ваше время.

SHR 07.03.2019 19:03

Другие вопросы по теме