我有一个词典列表,我试图创建另一个只列出值的列表。此列表如下所示:create view table employee_decimal as
select name
, address
, age
, cast(regexp_replace(salary, ',', '.') as decimal(7,3)) as salary
, doj
from employee;
这或多或少是我尝试做的事情。这运行正常:
a = [{'c1': 100}, {'c2': 222}, {'c3': 333}]
我试图通过快速列表理解来完成所有操作,但收到错误:at = []
for elem in a:
for i in elem:
at.append(elem[i])
。这就是我一直在尝试的:KeyError: 'c3'
我只想要at = [elem[i] for i in elem for elem in a]
答案 0 :(得分:4)
您可以将itertools.chain
与列表理解表达式一起使用:
>>> from itertools import chain
>>> list(chain(*[item.values() for item in a]))
[100, 222, 333]
OR,嵌套列表理解表达式为:
>>> [val for item in a for val in item.values()]
[100, 222, 333]
或者,您可以使用list.extend
以及简单的for
循环(作为替代,但我知道您要求列表理解):
new_list = []
for item in a:
new_list.extend(item.values())
# Final value hold by `new_list` will be:
# [100, 222, 333]
答案 1 :(得分:4)
您需要交换循环的顺序,以便可以对其进行评估。
at = [elem[i] for elem in a for i in elem]
=> None
at
=> [100, 222, 333]
答案 2 :(得分:3)
如何简单地联接或chain
所有dict.values
:
>>> from itertools import chain
>>> a = [{'c1': 100}, {'c2': 222}, {'c3': 333}]
>>> list(chain.from_iterable(map(dict.values, a)))
[100, 222, 333]
答案 3 :(得分:2)
>>> res = []
>>> for x in a:
res.extend(x.values())
>>> res
[100, 222, 333]
如果只有一个值,则可以使用:
>>> [list(x.values())[0] for x in a]
[100, 222, 333]
答案 4 :(得分:1)
试试这个:
at = []
for elem in a:
at += elem.values()
dict.values()
会返回一个包含dict
所有值的列表。对于您的情况,它将为每个元素返回一个包含单个组件的列表,因此您只需将其与at
列表连接起来。