2016-11-09 16 views
2

Ich versuche, einige Funktionen in MATLAB in Python zu replizieren und bin auf der Suche nach einer pythonischen Art, um dieses Problem zu lösen.Zugriff auf Dictionary-Werte in einer Liste

Betrachten Sie das folgende Beispiel.

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) 

Einige Daten importiert werden, ist jede Zeile ein Element in einer Liste und jede Spalte ist gepaart mit ihm in einem Wörterbuch Feldname ist.

ein einzelnes Feld eines bestimmten Elements Zugriff ist einfach

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

Wie kann ich alle Werte des ‚name‘ Feld in der Tabelle zurückzukehren, mit der Ausnahme entweder eine for-Schleife oder einer Liste Verständnis?

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

In MATLAB konnte ich die folgende

ages = [table(:).age] 

die ein Array Alter des enthält jeder zurückkehren würde.

Gibt es eine Möglichkeit, alle Elemente eines einzelnen Felds aus einer Liste von Elementen zurückzugeben? Oder ist das Listenverständnis der beste Weg?

[EDIT]: Wie wäre es wenn ich nur auf die ersten 2 Elemente zugreifen und ihre Felder bekommen möchte? Oder die letzten 2 Elemente? List Verständnis noch der beste Weg zu gehen?

Vielleicht gibt es eine bessere Datenstruktur, um dies zu ermöglichen?

+1

Was stimmt nicht mit der Liste Verständnis? –

+0

Was passiert, wenn ich nur 'nur die letzten 3 Elemente' auswählen möchte? – scotty3785

+1

Sie sollten wahrscheinlich einen Pandas 'DataFrame' dafür verwenden. Es entspricht einer MATLAB-Tabelle (tatsächlich basieren MATLAB-Tabellen entweder auf Pandas-Datenrahmen oder einer ähnlichen Datenstruktur von R). – TheBlackCat

Antwort

4

Eine list comprehension ist Ihre beste Wette für die Erstellung Ihrer Liste.

Das heißt, Sie sollten ein DictReader anstelle der Vanille reader in Ihrem Code verwenden:

... 
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

Ah. Großartig, danke. Das hatte ich vermisst. – scotty3785

+0

Was passiert, wenn ich nur 'nur die letzten 3 Elemente' auswählen möchte? Kann ich Slicing verwenden, um beispielsweise nur das Altersfeld der letzten 3 Elemente zu erhalten? – scotty3785

+0

Ja, warum nicht. '[x ['age'] für x in Tabelle [-3:]]' –

1

Nur ein alternativer Ansatz, wenn Sie wollen, mit Tabellen komplexere Dinge zu tun, dann ist es pandas das ist im Grunde programmatische Tabelle für 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

Sie verwenden können collections.defaultdict() als:

from collections import defaultdict 
d = defaultdict(list) 

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

d enthält die Liste aller Werte als key. Zum Beispiel für den Zugriff auf all Alter, tun:

d['ages'] 
Verwandte Themen