2016-05-24 18 views
2

Angenommen, ich möchte eine grundlegende Handlung des Preises gegen die Menge verschiedener Produkte machen. Meine Eingangsdaten würde wie folgt aussehen, dass:Heterogene Liste Slicing

P = np.array((1.75, 250), (1.59, 355), (1.25, 330)) 

Jetzt ich die Preise mit P[:, 0] bekommen. Aber jetzt will ich auch den Markennamen hinzuzufügen, wie folgt aus:

P = ((1.75, 250, "Store 1"), (1.59, 355, "Store 2"), (1.25, 330, "Store 3")) 

Weil ich Strings und Zahlen hier mischen, kann ich nicht mehr np.array verwenden, da will ich nicht Zahlen als Strings. Aber jetzt kann ich P[:, 0] nicht mehr tun, um die Preise zu bekommen (es gibt mir eine TypeError: tuple indices must be integers, not tuple).

Gibt es also einen einfachen Weg, die Preise in einer heterogenen Liste wie dieser noch zu erreichen? Ich weiß, dass ich sie in verschiedene Listen schreiben könnte, aber auf diese Weise könnte ich etwas Neues über Python lernen.

Antwort

2

Verwenden Sie eine Struktur-Array; start here

+0

So bin ich das richtig auf Kosten der explizite Angabe der Größe und den Namen jedes Elements unter der Annahme, erhalten Sie ‚Slicing‘, die leistungsmäßig mehr oder weniger gleichbedeutend mit der np.array und dem anderen überlegen zwei Vorschläge (die einfacher und flexibler sind)? – JonathanK

+0

Auch: struct Arrays scheinen nur Byte-Literale zu unterstützen (was sinnvoll ist), aber wenn ich sie drucke oder sie als Tick-Label an Matplotlib übergebe, wird auch das b '' gedruckt. Ich weiß, dass ich .decode mit Listenverstehen verwenden könnte, aber das würde den Zweck dieser Übung beschreiben. Also bleibe ich bei diesen beiden Möglichkeiten? – JonathanK

+0

1: Ja, das ist es im Grunde; die andere Lösung wird Ihnen keine numpige Geschwindigkeit geben; obwohl dies eine tolerierbare Sache für Plot-Achsen sein kann, die typischerweise nicht in Millionen zählen. 2: Ich habe dort keine Erfahrung, tut mir leid. –

2

Sie Liste Verständnis verwenden können:

>>> P = ((1.75, 250, "Store 1"), (1.59, 355, "Store 2"), (1.25, 330, "Store 3")) 
>>> [product[0] for product in P] 
[1.75, 1.59, 1.25] 
2

Wie wäre es mit und einem lambda Ausdruck?

>>> P = ((1.75, 250, "Store 1"), (1.59, 355, "Store 2"), (1.25, 330, "Store 3")) 
>>> price = map(lambda x: x[0], P) 
>>> price 
[1.75, 1.59, 1.25]