使用dict.fromkeys(),将后续操作应用于所有键。
使用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}]}
使用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)
来创建字典,并确保每个键对应的值都是独立的列表。