Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典转换与计数器_Python - Fatal编程技术网

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']))