我正在尝试复制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个元素并获取其字段,该怎么办?还是最后两个元素? 列表理解仍然是最好的方法吗?
也许有更好的数据结构允许这个?
答案 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']