Python 如何从每个字典都有三个键的字典列表中创建三个单独的值列表

Python 如何从每个字典都有三个键的字典列表中创建三个单独的值列表,python,list,dictionary,Python,List,Dictionary,我是Python新手。我的问题对有经验的开发人员和程序员来说可能很简单,但我还没有找到答案 我正在通过数据库查询检索一些数据。我已经成功地将查询返回的每一行组织为一个字典,它有三个键,每个键对应一个值。基本上,我已经将查询返回的所有数据行组织到一个字典列表中 字典列表看起来有点像这样: [ {'Date': date1, 'price': price1, 'itemnumber': number1}, {'Date': date2, 'price': price2, 'itemn

我是Python新手。我的问题对有经验的开发人员和程序员来说可能很简单,但我还没有找到答案

我正在通过数据库查询检索一些数据。我已经成功地将查询返回的每一行组织为一个字典,它有三个键,每个键对应一个值。基本上,我已经将查询返回的所有数据行组织到一个字典列表中

字典列表看起来有点像这样:

[
    {'Date': date1, 'price': price1, 'itemnumber': number1},
    {'Date': date2, 'price': price2, 'itemnumber': number2},
    ...
]

如何将此词典列表转换为对应于每个键的三个单独列表,即
日期
价格
项目编号

您可以将listcomp和dictcomp组合在一起:

# Defining lists
dates = []
prices = []
item_numbers = []
# Loop through list
for dictionary in your_list:
    dates.append(dictionary["Date"]) # Add the date to dates
    prices.append(dictionary["price"]) # Add the price to prices
    # Add item number to item_numbers
    item_numbers.append(dictionary["itemnumber"])
In [95]: ds
Out[95]: 
[{'Date': 'date1', 'itemnumber': 'number1', 'price': 'price1'},
 {'Date': 'date2', 'itemnumber': 'number2', 'price': 'price2'}]

In [96]: {key: [subdict[key] for subdict in ds] for key in ds[0]}
Out[96]: 
{'Date': ['date1', 'date2'],
 'itemnumber': ['number1', 'number2'],
 'price': ['price1', 'price2']}
请注意,我们有三个单独的列表,它们只是更方便地作为值存储在字典中。这样,如果我们决定增加一个额外的特征(比如“购买者”),我们不需要改变任何逻辑

for (field,values) in [(field,
            [result.get(field) for result in results]
        ) for field in results[0].keys()]:
    # this is ugly, but I can't see any other legal way to
    # dynamically set variables.
    eval "%s=%s" % (field, repr(value))
编辑为不[非法]修改
locals()
字典:(

使用列表理解:


也可以在可读性较差的单行程序中执行此操作:

date, price, itemnumber = zip(*[(d['Date'], d['price'], d['itemnumber']) for d in list_of_dicts])
或相同,但使用:


使用
映射(列表,…)
在第二种情况下,将返回的元组转换为列表。

的文档特别说明不要修改元组,实际上,如果内存可用,它在CPython中的函数中是不起作用的。你是对的,我采用了一种快捷方式。它在我的python 2.6.6解释器中确实起作用,但我会修复。具体取决于代码的上下文,您可能还想将第一个作为
columns=[[d[key]代表dicts列表中的d]代表输入('Date'、'price'、'itemnumber')]
@SteveJessop它还可以更直观地替代
zip
上的转置。很好!
date, price, itemnumber = zip(*[(d['Date'], d['price'], d['itemnumber']) for d in list_of_dicts])
from operator import itemgetter
date, price, itemnumber = zip(*map(itemgetter('Date', 'price', 'itemnumber'), list_of_dicts))