访问列表中的字典值

时间:2016-11-09 16:52:36

标签: python list python-3.x dictionary

我正在尝试复制python中MATLAB中的一些功能,我正在寻找一种解决这个问题的pythonic方法。

请考虑以下示例。

import io
import csv

data = """name,age,height
scott,31,175
bob,45,180
george,2,100
"""

f = io.StringIO(data)
reader = csv.reader(f, delimiter=',')
fields = next(reader)
table = []

for row in reader:
    item = dict(zip(fields, row))
    table.append(item)

导入了一些数据,每行都是列表中的一个项目,每列都与字典中的字段名称配对。

访问特定元素的单个字段很简单

>>> table[1]['name']
'bob'

除了使用for循环或列表理解之外,如何返回表中'name'字段的所有值?

ages = [x['age'] for x in table]

在MATLAB中,我可以执行以下操作

ages = [table(:).age]

将返回包含每个人年龄的数组。

有没有办法从项目列表中返回单个字段的所有元素?或者列表理解是最好的方法吗?

[编辑]:如果我只想访问前2个元素并获取其字段,该怎么办?还是最后两个元素? 列表理解仍然是最好的方法吗?

也许有更好的数据结构允许这个?

3 个答案:

答案 0 :(得分:4)

list comprehension是您创建列表的最佳选择。

也就是说,您应该在代码中使用DictReader而不是香草reader

...
f = io.StringIO(data)
reader = csv.DictReader(f) # default delimiter is ,
table = list(reader)

ages = [x['age'] for x in table]
names = [x['name'] for x in table]

答案 1 :(得分:1)

如果您想要使用表格执行更复杂的操作,那么只需一种替代方法,那么pandas基本上是Python的程序化电子表格:

>>> f = io.StringIO(data)
>>> import pandas as pd
>>> df = pd.DataFrame.from_csv(f)
>>> df.age
name
scott     31
bob       45
george     2
Name: age, dtype: int64
>>> df.age.values
array([31, 45,  2])
>>> df.age[-2:]
name
bob       45
george     2
Name: age, dtype: int64​
>>> df.index
Index(['scott', 'bob', 'george'], dtype='object', name='name')

答案 2 :(得分:0)

您可以将collections.defaultdict()用作:

from collections import defaultdict
d = defaultdict(list)

for data in table:
    for k, v in data.items():
        d[k].append(v)

d将包含所有值的列表key。例如,要访问所有年龄,请执行:

d['ages']