我是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的帖子。我怎么能这样做。我应该使用for循环还是有另一种简单的方法? 我使用Flask框架。
例如我通过调用这个/editpost/1
的网址获得了一个id,然后我想获得id为1的帖子。我怎么能这样做?
为什么它是整数1L而不是1?
非常感谢。
答案 0 :(得分: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
。< / p>
答案 1 :(得分: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]
答案 2 :(得分:1)
你可以试试2种可能比你的方法更容易的选择。
第一个被称为“列表推导”,它们几乎总是迭代对象的最快方式(在我看来,最好的)。我不确定,但我认为它们对列表,元组和字典也有效。所以,你可以这样写:
// "posts" is the list of dictionaries you wrote in the question
my_post = [x for x in posts if x['id'] == 1L]
第二个选项是使用Functional Programming中的方法并在Python中调用内置的filter
函数,该函数有2个参数。第一个是表达过滤器条件的函数(实际上,这个东西叫做 lambda表达式),第二个参数只是可迭代对象:
filter (lambda x : x['id'] == 1L, posts)
这样,'filter'函数在每次迭代中从'posts'中获取一个元素,并将其作为lambda的参数传递。然后,它检查当前帖子的id值是否为1L,如果为真,则过滤该帖子并在循环结束时返回。
我不知道第二个选项是否有点先进。对不起,那个案子。
希望它对你有所帮助! :)