2013-02-20 166 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,如果是,则过滤并在循环结束时返回该帖子。

我不知道第二个选项是否有点高级。对不起在这种情况下。

希望它可以帮助你! :)