a=[{'kart': ['alice', 'marie'],
'vinod': ['alice', 'marie'],
'jordan': ['alice', 'marie'],
'joe': ['marie', 'alice']},
{'kart': ['alice', 'marie'],
'vinod': ['alice', 'marie'],
'jordan': ['alice', 'marie'],
'joe': ['marie', 'alice']},
{'kart': ['alice', 'marie'],
'vinod': ['alice', 'marie'],
'jordan': ['alice', 'marie'],
'joe': ['marie', 'alice']}]
我有上面的词典列表a。我想要下面想要的输出,方法是将一个字符串附加到a [0]的键或列表中的第一个元素。
所需的输出:
{'kart': ['marie', 'alice', 'elsie'],
'vinod': ['alice', 'marie'],
'jordan': ['marie', 'alice'],
'joe': ['marie', 'alice']}
我得到的输出:
{'kart': ['alice', 'marie', 'elsie'],
'vinod': ['alice', 'marie', 'elsie'],
'jordan': ['alice', 'marie', 'elsie'],
'joe': ['alice', 'marie', 'elsie']}
我正在使用的代码:
import copy
dic_copy=copy.deepcopy(a[0])
dic_copy.setdefault("kart",[]).append("elsie")
由于某种原因,当我只想要一个键时,以上代码将附加到字典中的所有键上。任何建议都会有所帮助!
答案 0 :(得分:0)
您的问题是,您以某种方式创建的字典具有指向相同列表的键,而不是四个相等的列表。这意味着一旦更改了单个值,所有其他值似乎也都被更改了(实际上,它只是单个对象)。
您的setdefault很好,它是“ set or get && return”。
您的情况:
>>> names = ['marie', 'alice']
>>> d = {k: names for k in ['kart', 'vinod', 'jordan', 'joe']}
>>> d.setdefault('kart', []).append('elsie')
>>> d
{'kart': ['marie', 'alice', 'elsie'],
'vinod': ['marie', 'alice', 'elsie'],
'jordan': ['marie', 'alice', 'elsie'],
'joe': ['marie', 'alice', 'elsie']}
将dict的创建更改为{k: names[:] for k in ...}
即可达到您的期望-名称相等,但对象不同。
要对此进行检查,请尝试使用is
进行身份检查,即:
>>> d['kart'] is d['joe'] # will be True in your case
棘手的是deepcopy
不会改变结构。因此,如果您的字典具有指向同一列表的键,则该字典的深层副本将具有相同的结构。
如果您已经在此结构中指定了dict,并且希望在值中具有不同的标识,则可以像下面这样重新创建它:
>>> names = ['marie', 'alice']
>>> d = {k: names for k in ['kart', 'vinod', 'jordan', 'joe']}
>>> d['kart'] is d['joe']
True
>>> d = {k:v[:] for k, v in d.items()}
>>> d['kart'] is d['joe']
False
答案 1 :(得分:0)
尝试
a[keyname].append(value)
之前:
a = {'kart':['marie','alice','elsie']}
a["kart"].append("abc")
之后
a = {'kart':['marie','alice','elsie','abc']}