2013-01-16 52 views
3

具有特定鍵值的詞典我的詞典列表:的Python:如何訪問列表中的

[ 
{"START":"Denver", "END":"Chicago", "Num":0}, 
{"START":"Dallas", "END":"Houston", "Num":3}, 
{"START":"Virginia", "END":"Boston", "Num":1}, 
{"START":"Washington", "END":"Maine", "Num":7} 
] 

如何訪問字典此列表中擁有最Python的方式"START":"Virginia", "END":"Boston"

+1

保證唯一性嗎?訂單可以改變嗎? – thegrinner

+0

是的,我保證唯一性,訂購不能改變。 – alwbtc

+0

我試圖改變「Num」的值 – alwbtc

回答

8

最Python的方式可能是一個列表理解:

[ d for d in dict_list if d["START"] == "Virginia" and d["END"] == "Boston" ] 

由於mgilson指出,如果假定有與該對位置列表中只有一個項目,你可以使用next與相同的生成器表達式,而不是括號。這將只返回匹配的字典,而不是包含它的一個項目列表:

trip = next(d for d in dict_list 
       if d["START"] == "Virginia" and d["END"] == "Boston") 

無論哪種方式,結果引用同一個字典對象(S)作爲原始列表,這樣就可以進行更改:

trip["Num"] = trip["Num"] + 1 

而這些變化將在那裏通過原始列表訪問時:

print(dict_list[2]["Num"]) # 2 

由於阿什維尼·喬杜裏在他的答覆中指出,搜索本身可以指定爲字典。在這種情況下,if條件在發電機表達是有一點不同,但邏輯是否則相同的:

search = { "START": "Virginia", "END": "Boston" } 
trip = next(d for d in dict_list if all(i in d.items() for i in search.items())) 
+0

** + 1 **打我吧 – Eric

+0

後者也可以寫成......如果設置(d.items())&set(search.items() ))' – georg

+0

訪問這個字典後,我會改變它的「Num」鍵的值,該怎麼做? – alwbtc

2

使用all()dict.items():使用list comprehension

In [66]: lis=[          
    ....: {"START":"Denver", "END":"Chicago", "Num":0}, 
    ....: {"START":"Dallas", "END":"Houston", "Num":3}, 
    ....: {"START":"Virginia", "END":"Boston", "Num":1}, 
    ....: {"START":"Washington", "END":"Maine", "Num":7} 
    ....: ] 

In [67]: for x in lis:        
    ....:   if all(y in x.items() for y in search.items()): 
    ....:     x['Num']="foobar"  #change Num here 
    ....:   

In [68]: lis 
Out[68]: 
[{'END': 'Chicago', 'Num': 0, 'START': 'Denver'}, 
{'END': 'Houston', 'Num': 3, 'START': 'Dallas'}, 
{'END': 'Boston', 'Num': 'foobar', 'START': 'Virginia'}, 
{'END': 'Maine', 'Num': 7, 'START': 'Washington'}] 

In [58]: [x for x in lis if all(y in x.items() for y in search.items())] 
Out[58]: [{'END': 'Boston', 'Num': 1, 'START': 'Virginia'}] 
+0

或者在理解形式中,'[x for x in lis if all(y in x.items()for y in search.items())]' – Eric

+0

訪問這個字典後,我會改變它的「Num」關鍵,怎麼做? – alwbtc

+1

@alwbtc我已經更新瞭解決方案。 –

1

如果每個項目是唯一的,那麼你可以這樣做:

def get_dict(items, start, end): 
    for dict in items: 
     if dict['START'] == start and dict['END'] == end: 
      return dict 

然後:

>>> items = [ 
    {"START":"Denver", "END":"Chicago", "Num":0}, 
    {"START":"Dallas", "END":"Houston", "Num":3}, 
    {"START":"Virginia", "END":"Boston", "Num":1}, 
    {"START":"Washington", "END":"Maine", "Num":7} 
] 
>>> get_dict(items, 'Virginia', 'Boston') 
{"START":"Virginia", "END":"Boston", "Num":1} 

這是相當簡單的,但我想我會發布它的完整性的緣故。

+0

'return None'是完全多餘的,因爲默認情況下函數不返回任何值。 – Eric

+0

@Eric:好點。編輯。 – Michael0x2a

2

如果你打算做搜索了很多次,你知道有一個且只有一個每對的位置快譯通,你可以創建一個從列表這樣的字典:

d = dict(((x['START'], x['END']), x) for x in list_of_dicts) 

而且然後就去做查找在這樣的新字典:

found_dict = d[('Virginia', 'Chicago')] 

你可以改變found_dict那麼無論你需要的。

+0

或:'{','。join([x ['START'],x ['END']]):x for list_of_dicts} – Eric

+0

@Eric,對於Python> = 2.7 –

+0

爲什麼要加入它們?更好地使用'(開始,結束)'元組作爲密鑰 – Eevee

相關問題