2016-11-09 81 views
2

我想複製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循環或列表理解?

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

在MATLAB我可以做到以下幾點

ages = [table(:).age] 

這將返回一個包含每個人的年齡的數組。

有沒有辦法從項目列表中返回單個字段的所有元素?或者列表理解是最好的方法?

[編輯]:如果我只想訪問前兩個元素並獲得其字段,那麼該怎麼辦?或者最後2個元素? 列表理解仍然是最好的方法嗎?

也許有更好的數據結構來允許這樣做?

+1

什麼是錯的列表理解? –

+0

如果我只想選擇'僅最後3個項目',該怎麼辦? – scotty3785

+1

你可能應該使用一個熊貓'DataFrame'來做到這一點。它相當於一個MATLAB表(實際上,MATLAB表基於熊貓數據框或來自R的類似數據結構)。 – TheBlackCat

回答

4

A 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] 
+0

啊。非常感謝。我錯過了。 – scotty3785

+0

如果我只想選擇'僅最後3個項目'會怎麼樣?例如,我可以使用切片來獲取最後3個項目的年齡字段嗎? – scotty3785

+0

是的,爲什麼不。 '[x ['age'] for table in [-3:]]' –

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') 
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']