Python更新列表中字典值的方法

3

我有一个包含两个元素(键值对)的列表,它们都具有相同的键。然而,一些值是不同的,如下所示。

alist = [{u'a': u'x', u'b': u'y', u'c': u'z'}, {u'a': u'x', u'b': u'm', u'c': u'n'}]

我希望能够从字典中获取用户输入更新的新数据,并将其更新到alist中,如下所示。

a_dict  = {'a': ['user_input_x'], 'b': ['user_input_y', 'user_input_m'], 'c': ['user_input_z', 'user_input_n']}

结果列表应该像这样,
ans_alist = [{u'a': u'user_input_x', u'b': u'user_input_y', u'c': u'user_input_z'}, {u'a': u'user_input_x', u'b': u'user_input_m', u'c': u'user_input_n'}] 

我正在尝试几个事情,以下是代码片段,但由于这是字典,代码正在用相同的值更新所有键,

for i in range(0, 2):
    for key in alist:
        key['a'] = a_dict['a'][i]
        key['b'] = a_dict['b'][i]
        key['c'] = a_dict['b'][i]
print alist


ans_alist = [{u'a': ['user_input_x'], u'b': 'user_input_y', u'c': 'user_input_n'}, {u'a': ['user_input_x'], u'b': 'user_input_y', u'c': 'user_input_n'}]

感谢您的帮助。

1
你目前做了什么?你能提供你的代码吗? - Murtuza Z
遍历a_dict,在alist中查找匹配的键。如果找到匹配项,则将该键的值替换为匹配值。编写代码,如果仍然无法正常工作,请发布它,我们会为您修复。 - Łukasz Szczesiak
你创建了那些列表吗?如果你修正输入,我认为你可以让问题变得更容易。 - Anton vBR
@AntonvBR:遗憾的是,我无法控制用户输入格式。 - tgcloud
3个回答

2

新回答:

根据 a_dict 中的值更新 alist

>>> new_alist = []
>>> for i,d in enumerate(alist):                   #traverse the list
       temp = {} 

       for key,val in d.items():                   #go through the `dict`
           if len(a_dict[key])>0 :                 #alist->[key] is present in a_dict
               temp[key] = a_dict[key].pop(0)      #used the value, delete it from a_dict
           else :                                  #use previous updated value
               temp[key] = new_alist[i-1][key]     #get value from previously updated 

       new_alist.append(temp)                      #add the updated `dict`     

#驱动程序数值

IN :  alist = [{u'a': u'x', u'b': u'y', u'c': u'z'}, 
               {u'a': u'x', u'b': u'm', u'c': u'n'}]
IN :  a_dict  = {'a': ['user_input_x'], 'b': ['user_input_y', 'user_input_m'], 'c': ['user_input_z', 'user_input_n']}

OUT : new_alist
     => [{'a': 'user_input_x', 'b': 'user_input_y', 'c': 'user_input_z'}, 
         {'a': 'user_input_x', 'b': 'user_input_m', 'c': 'user_input_n'}]

新回答:

计算a_dict


>>> from collections import defaultdict
>>> a_dict = defaultdict(list)

>>> for d in alist:                                         #traverse the list
        for key,val in d.items(): 
            if val not in a_dict[key]:                      #if val not already there
               a_dict[key].append(val)                      #add it to the [key]

>>> a_dict
=> defaultdict(<class 'list'>, 
       {'a': ['user_input_x'], 
        'b': ['user_input_y', 'user_input_m'], 
        'c': ['user_input_z', 'user_input_n']
   })

计算 ans_list

>>> ans_list = []
>>> for d in alist:                                         #traverse the list
        temp = {} 
        for key,val in d.items(): 
            temp[key] = val 
        ans_list.append(temp)                               #add the new dictionary

>>> ans_list
=> [{'a': 'user_input_x', 'b': 'user_input_y', 'c': 'user_input_z'}, 
    {'a': 'user_input_x', 'b': 'user_input_m', 'c': 'user_input_n'}]

为避免混淆,user_input_x 或任何其他用户输入值都将是随机值(不会有 user_input_ 前缀)。我已经标注了因为例如:键 a 在两个元素中都有 user_input_x,这意味着用户输入将是相同的,但对于键 b,两个元素的输入将是不同的。 - tgcloud
@tgcloud,请立即检查。根据“字典”“alist”的内容,您的“ans_list”和“a_dict”的值将发生变化。 - Kaushik NP
@ Kaushik:在计算 ans_list 时,值 val 应该来自 a_dict,因为 a_dict 将保存用户输入。 - tgcloud
哦哦哦哦,原来是这样。问题有点令人困惑。我会根据要求稍作修改。 - Kaushik NP
抱歉造成混淆! - tgcloud
alist 中的数据是从 XML 文件生成的。 - tgcloud

1
另一种替代方法是:

from collections import defaultdict
repeat_count = len(alist)
ans_alist = [defaultdict(dict) for _ in range(repeat_count)]

for k, v in a_dict.items():
    mul_times = repeat_count / len(v)   # Use // if Python 3
    extend_counter = repeat_count % (mul_times * len(v))
    repeat_v = v * mul_times + v[:extend_counter]

    unicode_k = u'{}'.format(k)
    for index, val in enumerate(repeat_v):
        ans_alist[index][unicode_k] = u'{}'.format(val)

0
你需要迭代字典列表,每次获取一个字典。 然后迭代它的键并从结果列表中弹出项:
new_alist = []
for d in alist:
    new_dict = {}
    for k in d.keys():
        if a_dict[k]:
            new_dict[k] = a_dict[k].pop(0)
    new_alist.append(new_dict)

>>> new_alist
[{u'a': 'user_input_x', u'c': 'user_input_z', u'b': 'user_input_y'}, {u'c': 
'user_input_n', u'b': 'user_input_m'}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接