使用dict.fromkeys(),将后续操作应用于所有键。

10 浏览
0 Comments

使用dict.fromkeys(),将后续操作应用于所有键。

我肯定我做了一些愚蠢的事情,但是我正在尝试将一个字典列表转化为一个字典,其中字典中的一个键值对成为键,其余的键值对成为值的一部分,其中值是一个字典列表。一个示例在这里:

In [115]: aa = ['a', 'b', 'c', 'd']
In [116]: my_dict = dict.fromkeys(key_list, [])
In [143]: my_dict
Out[143]: {'a': [], 'b': [], 'c': [], 'd': []}
In [117]: list_of_dicts = [{'letter':'a', 'val1':2, 'val2':3}, {'letter':'b', 'val1':4, 'val2':5}, {'letter':'c', 'val1':6, 'val2':7}]
In [118]: %paste
for entry in list_of_dicts:
    remainder = {k:v for k, v in entry.iteritems() if k!='letter'}
    my_dict[entry['letter']].append(remainder)
## -- End pasted text --
In [119]: my_dict
Out[119]: 
{'a': [{'val1': 2, 'val2': 3}, {'val1': 4, 'val2': 5}, {'val1': 6, 'val2': 7}],
 'b': [{'val1': 2, 'val2': 3}, {'val1': 4, 'val2': 5}, {'val1': 6, 'val2': 7}],
 'c': [{'val1': 2, 'val2': 3}, {'val1': 4, 'val2': 5}, {'val1': 6, 'val2': 7}],
 'd': [{'val1': 2, 'val2': 3}, {'val1': 4, 'val2': 5}, {'val1': 6, 'val2': 7}]}

为什么我的值被应用到字典中的每个条目上?

为什么最终的字典不是这样的:

In [121]: final_dict
Out[121]: 
{'a': [{'val1': 2, 'val2': 3}],
 'b': [{'val1': 4, 'val2': 5}],
 'c': [{'val1': 6, 'val2': 7}]}

0
0 Comments

使用dict.fromkeys()方法创建的my_dict字典中,所有的键都使用了相同的空列表作为值。这是因为dict.fromkeys()方法在创建字典时,会将所有键对应的值都设置为传入的第二个参数,而这里传入的是同一个空列表[]

为了解决这个问题,可以使用{k: [] for k in key_list}的方式创建字典,这样每个键都会对应一个新的空列表。

另外,还可以使用collections.defaultdict来创建字典。defaultdict会在插入新键时,调用list()方法创建一个新的空列表作为值。

为什么初始的my_dict看起来是这样的:my_dict = {'a': [], 'b': [], 'c': [], 'd': []}?因为这是你告诉它要使用的值。通过这样的方式查看my_dict,无法判断这些值是否是同一个列表。

因此,要避免出现这个问题,可以使用{k: [] for k in key_list}collections.defaultdict(list)来创建字典,并确保每个键对应的值都是独立的列表。

0