Python 字典转换与计数器
对象: 结果应该是:Python 字典转换与计数器,python,Python,对象: 结果应该是: data = [{'key': 11, 'country': 'USA'},{'key': 21, 'country': 'Canada'},{'key': 12, 'country': 'USA'}] 我开始试验: {'USA': {0: {'key':11}, 1: {'key': 12}}, 'Canada': {0: {'key':21}}} 我得到: result = {} for i in data: k = 0 result[i['cou
data = [{'key': 11, 'country': 'USA'},{'key': 21, 'country': 'Canada'},{'key': 12, 'country': 'USA'}]
我开始试验:
{'USA': {0: {'key':11}, 1: {'key': 12}}, 'Canada': {0: {'key':21}}}
我得到:
result = {}
for i in data:
k = 0
result[i['country']] = dict(k = dict(key=i['key']))
那么,我如何才能将计数器改为
k
?也许有一种更优雅的方法来创建字典?要添加数字,请使用{key:value}语法
{'Canada': {'k': {'key': 21}}, 'USA': {'k': {'key': 12}}}
我使用了现有结果项的len()
:
result = {}
for i in data:
k = 0
result[i['country']] = dict({k : dict(key=i['key'])})
也许有一种更有效的方法可以做到这一点,但我认为这将是最具可读性的。更好。这里有另一种方法:
>>> import collections
>>> data = [{'key': 11, 'country': 'USA'},{'key': 21, 'country': 'Canada'},{'key': 12, 'country': 'USA'}]
>>> result = collections.defaultdict(dict)
>>> for item in data:
... country = item['country']
... result[country][len(result[country])] = {'key': item['key']}
...
>>> dict(result)
{'Canada': {0: {'key': 21}}, 'USA': {0: {'key': 11}, 1: {'key': 12}}}
这会将i['key']
作为key
关键字参数传递给dict
构造函数(这是您想要的-因为这会导致字符串“key”
用作关键字),然后将其结果作为k
关键字参数传递给dict
构造函数(这不是您想要的)-这就是Python中参数传递的工作方式。您有一个名为k
的局部变量这一事实与此无关
要制作一个dict,其中k
的值用作键,最简单的方法是使用字典的文本语法:{1:2,3:4}
是一个dict,其中键1
与值2
关联,键3
与值4
关联。请注意,这里我们对键和值使用任意表达式,而不是名称,因此我们可以使用局部变量,生成的字典将使用命名值
因此,您需要{k:{'key':i['key']}
也许有一种更优雅的方法来创建字典
你可以通过添加项目来创建一个列表,然后用
dict(enumerate(the_list))
将列表转换成一个字典。这至少可以让你不用手动进行计数,但这是非常间接的。为什么是'Canada':{1:{'key':21}
而不是'Canada':{0:{'key':21}
?抱歉,我犯了一个错误。已修复。@vlad也发布您的解决方案,以便其他人可以从中受益如果您使用顺序索引,并且内部目录中只有一项(键),您应该使用一个键列表而不是这些嵌套的目录,并且不会丢失任何信息:{USA':[11,12],'Canada':[21]}
。这将大大简化您的代码。@agf True,但为了更好地理解,我简化了这个示例(可能太多了)。这仍然不能给出所需的答案。has_key
已被弃用。如果结果中没有国家/地区:,则应使用。此外,当您需要字典键的默认值时,应使用defaultdict
以便自动完成测试:结果=集合。defaultdict(dict)
。
import itertools as it, operator as op
def dict_transform(dataset, key_name=None, group_by=None):
result = {}
sorted_dataset = sorted(data, key=op.itemgetter(group_by))
for k,g in it.groupby(sorted_dataset, key=op.itemgetter(group_by)):
result[k] = {i:{key_name:j[key_name]} for i,j in enumerate(g)}
return result
if __name__ == '__main__':
data = [{'key': 11, 'country': 'USA'},
{'key': 21, 'country': 'Canada'},
{'key': 12, 'country': 'USA'}]
expected_result = {'USA': {0: {'key':11}, 1: {'key': 12}},
'Canada': {0: {'key':21}}}
result = dict_transform(data, key_name='key', group_by='country')
assert result == expected_result
dict(k = dict(key=i['key']))