Python 将目录列表转换为一行中的多个列表

Python 将目录列表转换为一行中的多个列表,python,Python,作为查询的结果,我收到一个迭代器,其中每行有两个键“x”和“y”。我想从所有行中提取一个包含x元素和y元素的列表 示例数据: data = ({"x": 1, "y": -1}, {"x": 2, "y": -2}, {"x": 3, "y": -3}) 我想要的是: x = [1, 2, 3] y = [-1, -2, -3] 现在我可以做一个for循环: x, y =

作为查询的结果,我收到一个迭代器,其中每行有两个键“x”和“y”。我想从所有行中提取一个包含x元素和y元素的列表

示例数据:

data = ({"x": 1, "y": -1}, {"x": 2, "y": -2}, {"x": 3, "y": -3})
我想要的是:

x = [1, 2, 3]
y = [-1, -2, -3]
现在我可以做一个for循环:

x, y = [], []
for row in data:
    x.append(row["x"])
    y.append(row["y"])
或者像这样:

x, y = [b[0] for b in [list(a.values()) for a in data]], [b[1] for b in [list(a.values()) for a in data]]

但在我看来,应该有一种更优雅、更直截了当的方式来做这件事,而我却没有看到。有什么建议吗?

这里有一个可能的解决方案,使用
zip

x, y = zip(*(x.values() for x in data))
如果希望
x
y
成为列表(而不是元组):

您可能还想使用@tobias_k提出的方法(我认为是最干净的方法):

如果并非所有词典中的键顺序都一致,请保持一行:

x,y = ([x[1] for d in data for x in sorted(d.items())][i::2] for i in range(2))

虽然
zip
可以工作并且有点优雅,但其他人可能也很难理解它,它依赖于
y
之前所有列出
x
的dict,并使用一个足够新的Python版本,实际上尊重这个顺序

或者,您可以直接使用两种列表理解来反映您的循环:

data = ({"x": 1, "y": -1}, {"x": 2, "y": -2}, {"x": 3, "y": -3})
x = [e['x'] for e in data]
y = [e['y'] for e in data]
当然,如果愿意,也可以将它们放在与
x,y=[…],[…]
相同的行中,或者使用嵌套列表理解来获取两个键的值:

x, y = ([e[k] for e in data] for k in ("x", "y"))

@这取决于(a)在
y
之前列出
x
的所有dicts,以及(b)Python遵守这个顺序(Python 3做到了,但不是Python 2)嗯,为什么
methodcaller
而不是
zip(*dict.values,data))
@tobias_k OMG,你绝对正确。让我来修正一下,我真的不喜欢看到
x
被用作循环变量,因为它与数据中原始的
x
s和最终的
x
列表无关。外部的
list
调用是无用的;)你是对的,我想返回一个列表而不是一个映射对象。因此,
列表
。但如果其他人想要一个列表作为回报:)很好!“显性比隐性好。”--
x,y = ([x[1] for d in data for x in sorted(d.items())][i::2] for i in range(2))
data = ({"x": 1, "y": -1}, {"x": 2, "y": -2}, {"x": 3, "y": -3})
x = [e['x'] for e in data]
y = [e['y'] for e in data]
x, y = ([e[k] for e in data] for k in ("x", "y"))