Python-在一行中将多个字典值分配给不同的变量

Python-在一行中将多个字典值分配给不同的变量,python,Python,我有以下代码(顺便说一句,这会产生语法错误)。有人能帮我修复它,这样我就可以得到一个产生预期结果的版本吗 al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}] a, b, c = [i.a, i.b, i.c for i in al] 预期结果: a = [1, 4, 7, 10] b = [2, 5, 8, 11] c =

我有以下代码(顺便说一句,这会产生语法错误)。有人能帮我修复它,这样我就可以得到一个产生预期结果的版本吗

al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
a, b, c = [i.a, i.b, i.c for i in al]
预期结果:

a = [1, 4, 7, 10]
b = [2, 5, 8, 11]
c = [3, 6, 9, 12]

如果您提前知道钥匙:

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> a, b, c = [[d[key] for d in al] for key in 'abc'] # ('a', 'b', 'c')
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]
>>> d = {key: [d[key] for d in al] for key in al[0]}
>>> d
{'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11]}
>>> a, b, c = map(d.get, 'abc') # OR map(d.get, ('a', 'b', 'c'))
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]
如果您事先不知道钥匙:

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> a, b, c = [[d[key] for d in al] for key in 'abc'] # ('a', 'b', 'c')
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]
>>> d = {key: [d[key] for d in al] for key in al[0]}
>>> d
{'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11]}
>>> a, b, c = map(d.get, 'abc') # OR map(d.get, ('a', 'b', 'c'))
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]

如果您提前知道钥匙:

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> a, b, c = [[d[key] for d in al] for key in 'abc'] # ('a', 'b', 'c')
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]
>>> d = {key: [d[key] for d in al] for key in al[0]}
>>> d
{'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11]}
>>> a, b, c = map(d.get, 'abc') # OR map(d.get, ('a', 'b', 'c'))
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]
如果您事先不知道钥匙:

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> a, b, c = [[d[key] for d in al] for key in 'abc'] # ('a', 'b', 'c')
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]
>>> d = {key: [d[key] for d in al] for key in al[0]}
>>> d
{'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11]}
>>> a, b, c = map(d.get, 'abc') # OR map(d.get, ('a', 'b', 'c'))
>>> a
[1, 4, 7, 10]
>>> b
[2, 5, 8, 11]
>>> c
[3, 6, 9, 12]

如果您对单行程序感兴趣,并且如果您保证
al
目录中的键的顺序和存在,则:

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> dict(zip(al[0].keys(),zip(*[i.values() for i in al])))
{'a': (1, 4, 7, 10), 'c': (3, 6, 9, 12), 'b': (2, 5, 8, 11)}

如果您对单行程序感兴趣,并且如果您保证
al
目录中的键的顺序和存在,则:

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> dict(zip(al[0].keys(),zip(*[i.values() for i in al])))
{'a': (1, 4, 7, 10), 'c': (3, 6, 9, 12), 'b': (2, 5, 8, 11)}

你可以这样做:

al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]

result={}
for dic in al:
    for key,val in dic.items():
        result.setdefault(key,[]).append(val)

print result     
# {'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11]}
a,b,c=result['a'],result['b'],result['c']   

print a,b,c
# [1, 4, 7, 10] [2, 5, 8, 11] [3, 6, 9, 12]
如果要将词典中的名称绑定到当前名称空间中的名称,可以执行以下操作:

al = [{'a': 1, 'b': 2, 'c': 3, 'd':4}, 
      {'a': 4, 'b': 5, 'c': 6}, 
      {'a': 7, 'b': 8, 'c': 9}]

result={}
for dic in al:
    for k in dic:
        result.setdefault(k,[]).append(dic[k])

print result     
# {'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11], 'd': [4]}

for k in result:
    code=compile('{}=result["{}"]'.format(k,k), '<string>', 'exec')
    exec code

print a,b,c,d  
# [1, 4, 7, 10] [2, 5, 8, 11] [3, 6, 9, 12] [4]
al=[{'a':1,'b':2,'c':3,'d':4},
{'a':4,'b':5,'c':6},
{'a':7,'b':8,'c':9}]
结果={}
对于al中的dic:
对于dic中的k:
result.setdefault(k,[]).append(dic[k])
打印结果
#{'a':[1,4,7,10],'c':[3,6,9,12],'b':[2,5,8,11],'d':[4]}
对于结果中的k:
代码=编译('{}=result['{}]'.format(k,k),''exec')
执行代码
打印a、b、c、d
# [1, 4, 7, 10] [2, 5, 8, 11] [3, 6, 9, 12] [4]

您可以这样做:

al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]

result={}
for dic in al:
    for key,val in dic.items():
        result.setdefault(key,[]).append(val)

print result     
# {'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11]}
a,b,c=result['a'],result['b'],result['c']   

print a,b,c
# [1, 4, 7, 10] [2, 5, 8, 11] [3, 6, 9, 12]
如果要将词典中的名称绑定到当前名称空间中的名称,可以执行以下操作:

al = [{'a': 1, 'b': 2, 'c': 3, 'd':4}, 
      {'a': 4, 'b': 5, 'c': 6}, 
      {'a': 7, 'b': 8, 'c': 9}]

result={}
for dic in al:
    for k in dic:
        result.setdefault(k,[]).append(dic[k])

print result     
# {'a': [1, 4, 7, 10], 'c': [3, 6, 9, 12], 'b': [2, 5, 8, 11], 'd': [4]}

for k in result:
    code=compile('{}=result["{}"]'.format(k,k), '<string>', 'exec')
    exec code

print a,b,c,d  
# [1, 4, 7, 10] [2, 5, 8, 11] [3, 6, 9, 12] [4]
al=[{'a':1,'b':2,'c':3,'d':4},
{'a':4,'b':5,'c':6},
{'a':7,'b':8,'c':9}]
结果={}
对于al中的dic:
对于dic中的k:
result.setdefault(k,[]).append(dic[k])
打印结果
#{'a':[1,4,7,10],'c':[3,6,9,12],'b':[2,5,8,11],'d':[4]}
对于结果中的k:
代码=编译('{}=result['{}]'.format(k,k),''exec')
执行代码
打印a、b、c、d
# [1, 4, 7, 10] [2, 5, 8, 11] [3, 6, 9, 12] [4]
试试这个

a,b,c = [map(lambda x:x[ele], al) for ele in 'abc']
试试这个

a,b,c = [map(lambda x:x[ele], al) for ele in 'abc']

如果您的键未知,您可以简单地转置数据并创建另一个转置字典,只需通过
即可访问该字典,而无需创建独立变量

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> keys = al[0].keys()
>>> #Given your list of dictionary
>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> #determine the keys
>>> keys = al[0].keys()
>>> #and using itemgetter
>>> from operator import itemgetter
>>> #create a transpose dictionary
>>> al_transpose = dict(zip(keys,zip(*map(itemgetter(*keys),al))))
>>> al_transpose['a']
(1, 4, 7, 10)
>>> al_transpose['b']
(2, 5, 8, 11)
>>> al_transpose['c']
(3, 6, 9, 12)
注意不建议

如果确实要创建独立变量,可以通过将字典添加到
局部变量中来实现

locals().update(al_transpose)
>>> a
(1, 4, 7, 10)
>>> b
(2, 5, 8, 11)
>>> c
(3, 6, 9, 12)

如果您的键未知,您可以简单地转置数据并创建另一个转置字典,只需通过
即可访问该字典,而无需创建独立变量

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> keys = al[0].keys()
>>> #Given your list of dictionary
>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> #determine the keys
>>> keys = al[0].keys()
>>> #and using itemgetter
>>> from operator import itemgetter
>>> #create a transpose dictionary
>>> al_transpose = dict(zip(keys,zip(*map(itemgetter(*keys),al))))
>>> al_transpose['a']
(1, 4, 7, 10)
>>> al_transpose['b']
(2, 5, 8, 11)
>>> al_transpose['c']
(3, 6, 9, 12)
注意不建议

如果确实要创建独立变量,可以通过将字典添加到
局部变量中来实现

locals().update(al_transpose)
>>> a
(1, 4, 7, 10)
>>> b
(2, 5, 8, 11)
>>> c
(3, 6, 9, 12)

这就是您需要修改方法的方式

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> a, b, c = zip(*((i['a'], i['b'], i['c']) for i in al))
首先,您需要使用
i['a']
而不是
i.a
等,因为
a
是键,而不是属性

那会给你

>>> [(i['a'], i['b'], i['c']) for i in al]
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]
啊,行和列的方向不对。交换行和列的标准技巧是
zip(*A)

将这两个想法结合起来,在答案的顶部给出了一个表达

更直接的方法是嵌套列表理解

>>> a, b, c = [[x[k] for x in al] for k in 'abc']
如果键不是单个字符,则需要将它们作为元组手写体写出

>>> a, b, c = [[x[k] for x in al] for k in ('a', 'b', 'c')]

这就是您需要修改方法的方式

>>> al = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}, {'a': 10, 'b': 11, 'c': 12}]
>>> a, b, c = zip(*((i['a'], i['b'], i['c']) for i in al))
首先,您需要使用
i['a']
而不是
i.a
等,因为
a
是键,而不是属性

那会给你

>>> [(i['a'], i['b'], i['c']) for i in al]
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]
啊,行和列的方向不对。交换行和列的标准技巧是
zip(*A)

将这两个想法结合起来,在答案的顶部给出了一个表达

更直接的方法是嵌套列表理解

>>> a, b, c = [[x[k] for x in al] for k in 'abc']
如果键不是单个字符,则需要将它们作为元组手写体写出

>>> a, b, c = [[x[k] for x in al] for k in ('a', 'b', 'c')]

怎么样
[dict_uuu.values()for dict_uuin al]
@PauloScardine,它不能产生OP想要的东西。事实上,我忘了在python dicts.Great中不能保证顺序。我事先不知道钥匙是什么。字典列表将由web服务返回,该服务可能包含也可能不包含某些字段。第二种方法似乎是最完美的答案。那么
[dict_uu.values()for dict_uin al]
@PauloScardine,它不会产生OP想要的结果。事实上,我忘了python dicts不能保证顺序。太好了。我事先不知道钥匙是什么。字典列表将由web服务返回,该服务可能包含也可能不包含某些字段。第二种方法似乎是这里的完美答案。如果你真的必须在代码中显示键。在这种情况下,我通常动态地构建词汇库并进行导入pprint;pprint mydict,这样我可以创建一个符合pep8的dict,如果您真的必须在代码中显示密钥。在这种情况下,我通常动态地构建词汇库并进行导入pprint;pprint mydict,这样我可以创建一个符合pep8的dict这有点傻,因为你不能保证dict中键的顺序这有点傻,因为你不能保证dict中键的顺序