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

2024-03-29 02:02:16 发布

您现在位置: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 = [3, 6, 9, 12]

Tags: 代码in版本foral语法错误
3条回答

如果您事先知道钥匙:

>>> 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的dict中键的顺序和存在,那么:

>>> 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)}

如果您的键未知,您可以简单地转置数据并创建另一个转置字典,您可以通过keys而不是创建独立变量来访问它

>>> 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

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

相关问题 更多 >