2016-08-12 27 views
2

我有一個列表,它看起來像這樣:的Python和熊貓:查找列表中的字典根據鍵值

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],},] 

我想要得到的字典角度25,我該怎麼辦呢?


UPDATE:

玩熊貓一段時間後,我覺得這可能是可能

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

返回

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

但是,這是一個有點劈。

回答

2

假設在你的字典裏每一個角度都是獨特的,每個字典包含鍵「角」:

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

我做了一個更新。我覺得它看起來很簡單,你也可以檢查一下嗎? – cqcn1991

+0

@ cqcn1991你試過'df.query('angle == 25')。plot(x ='x',y ='y')'? – oldrinb

+0

@oldrinb恐怕這還不夠。核心問題是關於在給定行中提取信息。我還需要一些其他作品的價值。 – cqcn1991

0

內置filter功能會做你想要什麼......你剛剛需要爲它提供一個決定保留哪些對象的函數。下面的功能是has_angle

我在filter_by_angle中包裝了has_angle,所以我可以使用functools.partial來避免硬編碼尋找的角度。 filter_by_angle是一個發電機功能,所以它可以yield任意數量的匹配形狀。

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 

此打印:

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

注意,yield from語法需要Python 3.3或更高版本。

+0

對於一些優秀的程序員來說,這可能是一個很好的選擇。但是,我終於用2個帶有'pandas'的線破解了這個問題。 – cqcn1991

+0

@ cqcn1991:我無法分辨'pandas'是否是一項需求,或者是因爲您無法找到一種純Python方式而嘗試的東西。既然你剛剛開始使用列表和字典,我沒有看到任何需要將它全部轉換爲數據框來進行過濾。 –

+0

@ cqcn1991:另外,請自己回答你的問題,讓人們知道它已經解決了。 –