2016-08-12 1 views
2

Ich habe eine Liste, die wie folgt aussehen:Python & Pandas: Finden Sie einen dict innerhalb einer Liste nach Wert einer Taste

dict_list = [{'angle': 5.0, 
       'basic_info': '111', 
       'x': [1,2,3,4], 
       'y': [3,2,1,4],}, 
      {'angle': 25.0, 
       'basic_info': '111', 
       'x': [1,2,3,4], 
       'y': [3,1,5,2],}, 
      {'angle': 3.0, 
       'basic_info': '111', 
       'x': [1,2,3,4], 
       'y': [1,1,4,1],},] 

ich den dict Winkel 25 erhalten möchten, wie kann ich es tun?


UPDATE:

Nach einer Weile mit Pandas zu spielen, finde ich dies möglich sein könnte,

df = pd.DataFrame(dict_list) 
temp = df.query("(angle ==25)").T.to_dict()[temp.keys()[0]] 
temp 

Returns

{'angle': 25.0, 'basic_info': '111', 'x': [1, 2, 3, 4], 'y': [3, 1, 5, 2]} 

Aber das ist ein bisschen Hack.

Antwort

2

jeden Winkel in Ihrem Wörterbuch Unter der Annahme, ist einzigartig und jedes Wörterbuch enthält den Schlüssel ‚angle‘:

df = None 
for sub_dict in dict_list: 
    if sub_dict['angle'] == 25: 
     df = pd.DataFrame({'x': sub_dict['x'], 'y': sub_dict['y']}) 
     break # Stops after finding the first matching angle. 
if df is not None: 
    df.plot(x='x', y='y') 

enter image description here

+0

Ich habe ein UPDATE gemacht. Ich denke, es sieht ziemlich einfach aus. Kannst du das auch überprüfen? – cqcn1991

+0

@ cqcn1991 hast du versucht 'df.query ('angle == 25'). Plot (x = 'x', y = 'y')'? – oldrinb

+0

@oldrinb Ich fürchte, das ist nicht genug. Das Hauptproblem besteht darin, Informationen in einer bestimmten Zeile zu extrahieren. Ich brauche auch den Wert einiger anderer Werke. – cqcn1991

0

Das wird eingebaute in filter Funktion tun, was Sie wollen ... Sie nur Sie müssen eine Funktion füttern, die festlegt, welche Objekte zu behalten sind. Diese Funktion ist has_angle.

Ich wickelte has_angle in filter_by_angle, so dass ich functools.partial verwenden konnte, um hart zu vermeiden, den gewünschten Winkel zu kodieren. filter_by_angle ist eine Generatorfunktion, so kann es yield beliebig viele übereinstimmende Formen.

import functools 


def has_angle(angle, shape): 
    # get with default None prevents a KeyError on shapes 
    # without angles. 
    return shape.get('angle', None) == angle 


def filter_by_angle(angle, shapes): 
    filter_key = functools.partial(has_angle, angle) 
    yield from filter(filter_key, shapes) 


def main(): 
    dict_list = ... # Same as yours. 
    matching_shapes = filter_by_angle(25, dict_list) 
    for shape in matching_shapes: 
     print(shape) 
    return 

Diese Drucke:

{'y': [3, 1, 5, 2], 'angle': 25.0, 'x': [1, 2, 3, 4], 'basic_info': '111'} 

Beachten Sie, dass die yield from Syntax Python 3.3 oder höher benötigt.

+0

Dies kann eine gute Alternative für einige gute Programmierer sein. Letztendlich habe ich dieses Problem jedoch mit 2 Zeilen mit 'Pandas' gehackt. – cqcn1991

+0

@ cqcn1991: Ich konnte nicht sagen, ob 'Pandas' eine Anforderung waren, oder nur etwas, was du versucht hast, weil du keine reine Python-Methode finden konntest. Da Sie nur mit Listen und Dicts begonnen haben, sah ich keine Notwendigkeit, alle Daten in Datenframes umzuwandeln, nur um sie zu filtern. –

+0

@ cqcn1991: Bitte beantworten Sie Ihre Frage auch selbst, damit die Leute wissen, dass sie gelöst wurde. –

Verwandte Themen