2013-02-20 43 views
1

元素我是初學者使用Python和我有這樣查找列表

[{'status': 1L, 'permalink': 'said', 'title': 'a', 'author': 'said', 'content': 'a', 'created_on': datetime.datetime(2013, 2, 10, 17, 46, 9), 'type': 1L, 'id': 1L}, 
{'status': 1L, 'permalink': 'said', 'title': 'hello', 'author': 'said', 'content': 'this is my first post', 'created_on': datetime.datetime(2013, 2, 10, 17, 48, 5), 'type': 2L, 'id': 2L}] 

清單我想要得到它具有ID 1.How我可以做我this.Should用於循環後還是有另一種簡單的方法? 我使用Flask框架。

例如,我通過調用這樣的url得到了一個id /editpost/1然後我想用id來獲得帖子1.我該怎麼做? 爲什麼它是整數1L而不是1? 非常感謝。

回答

2

1L是python long類型;它與正常的int一樣,python認爲它是一樣的,區別並不重要。

爲了讓你的鑰匙匹配的特定項目,我會使用next()功能與發電機的表達:

entryid = 1 

try: 
    match = next(s for s in inputlist if s['id'] == entryid) 
except StopIteration: 
    match = None # not found 

這會發現,有鑰匙id符合您的EntryID的第一字典,或如果沒有這樣的項目,則將match設置爲None

1

雖然Martijn Pieters回答了您如何在列表中找到您的數據的問題,但您的問題的實際答案是使用數據庫並查詢數據庫中的id。你不應該混淆代碼和數據 - 這正是數據庫的用途。

但是,如果你是絕對肯定的是,你不希望使用一個數據庫來存儲在您的文章,這將是一個不錯的主意,以創建一個字典索引通過其ID的帖子,簡單地查詢字典:

#construct the dictionary 
posts_by_id = {post["id"]: post for post in list_of_posts} 

#now getting a post is as simple as this: 
mypost = posts_by_id[theid] 
+0

我懷疑列表來自某處*每個請求*。從ID創建一個映射是*很好*但只有當你使用它不止一次。 :-) – 2013-02-20 21:13:01

1

你可以嘗試2種替代方法,這可能比你的方法更容易。

第一個被稱爲「列表解析」,它們幾乎總是迭代對象的最快方法(在我看來,最好)。我不確定,但我認爲它們對列表,元組和字典也有效。所以,你可以寫這樣的事情:

// "posts" is the list of dictionaries you wrote in the question 

my_post = [x for x in posts if x['id'] == 1L] 

第二個選擇是從函數式編程使用的方法和調用內置的Python filter功能,其中有2個參數。第一個是表示過濾器的條件的函數(實際上,這件事稱爲lambda表達式),第二個參數僅僅是迭代的對象:

filter (lambda x : x['id'] == 1L, posts) 

以這種方式,「過濾器」函數從每個迭代中的'posts'中獲取一個元素,並將其作爲lambda的參數傳入。然後,它檢查當前帖子的id值是否爲1L,如果是,則過濾並在循環結束時返回該帖子。

我不知道第二個選項是否有點高級。對不起在這種情況下。

希望它可以幫助你! :)