如何正确使用dic.setdefault(key,[])。append()

时间:2018-11-03 09:08:44

标签: python list dictionary append

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")

由于某种原因,当我只想要一个键时,以上代码将附加到字典中的所有键上。任何建议都会有所帮助!

2 个答案:

答案 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']}