Python 3.x 具有不同于字符串的键的词典列表

Python 3.x 具有不同于字符串的键的词典列表,python-3.x,dictionary,Python 3.x,Dictionary,这些是我的意见 hand = {'*': 1, 'v': 2, 'n': 1, 'i': 1, 'l': 2} string = 'abc' 我需要用字符串中的每个字符替换“*”,并将新的dict附加到列表中。我需要的输出是: [{'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}] 这就是我所做的

这些是我的意见

hand = {'*': 1, 'v': 2, 'n': 1, 'i': 1, 'l': 2}
string = 'abc'
我需要用字符串中的每个字符替换“*”,并将新的dict附加到列表中。我需要的输出是:

[{'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}

谢谢

这将为相同的数据创建一个新名称:

您总是在修改同一本词典。将引用存储到
列表中(顺便说一句,不要将
列表
用作变量名-您会隐藏内置的
列表()
)。 如果打印列表内容的
id()
,您将看到它们都是相同的:

print( id(x) for x in list) # try that to see its the same object trice
您需要复制数据来创建三个不同的字典

我选择从您的
字符串中更新1-elem
dict
,并在弹出
'*'后使用
手的剩余符号更新它们:

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}]

您可以在此处找到有关可变项副本的更多信息:


要同时更新现有密钥,请执行以下操作:

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

可能的重复-列表也是同样的问题-您有一个dict,但原理是一样的…谢谢您的帮助!在回顾这个解决方案之后,我遇到了一个问题。如果t中有一个元素也在手上,它将不会被更新,这是我不想要的。例如,如果t=aeiou,列表中的一个元素缺少字符“i”。第三个元素没有原始的“i”:[{'a':1,'v':2,'n':1,'l':2},{'e':1,'v':2,'n':1,'l':2},{'i':1,'v':2,'n':1,{'o':1,'v':2},{'n':1,'v':2,'n':1,'i':1,'@SHR您的第一个数据没有这个问题。我添加了一个手动更新您的dicts-您可以将其用于您的新问题。
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