这些是我的投入
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}
谢谢
答案 0 :(得分:1)
这将为相同数据创建一个新名称:
newHand = hand
您始终在修改同一词典。您可以将引用存储到list
中(并且不要将list
用作变量名,而是将内置的list()
阴影化)。
如果您打印列表内容的id()
,您会发现它们都是相同的:
print( id(x) for x in list) # try that to see its the same object trice
您需要复制数据来创建三个不同的字典。
我选择从您的dict
更新1个元素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}]
您可以在此处找到有关可变拷贝的更多信息:How to clone or copy a list?
还要更新现有密钥:
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