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 的帖子。我该怎么做。我应该使用 for 循环还是有其他简单的方法?我使用 Flask 框架。

例如,我通过调用这样的 url 获得了一个 id,/editpost/1然后我想获得 id 为 1 的帖子。我该怎么做?还有为什么它是整数 1L 而不是 1?非常感谢。

4

3 回答 3

2

1L是pythonlong类型;它和 normal 一样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

于 2013-02-20T21:06:24.163 回答
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]
于 2013-02-20T21:11:16.723 回答
1

您可以尝试两种可能比您的方法更容易的替代方法。

第一个称为“列表推导”,它们几乎总是迭代对象的最快方法(在我看来,是最好的)。我不确定,但我认为它们对列表、元组和字典也有效。所以,你可以这样写:

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

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

filter第二种选择是使用函数式编程中的一种方法并调用Python 中的内置函数,该函数有 2 个参数。第一个是表达过滤条件的函数(其实这个东西叫做lambda 表达式),第二个参数就是可迭代对象:

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

这样,'filter' 函数在每次迭代中从 'posts' 中获取一个元素,并将其作为 lambda 的参数传入。然后,它检查当前帖子的 id 值是否为 1L,如果为真,则该帖子被过滤并在循环结束时返回。

我不知道第二个选项是否有点高级。在那种情况下很抱歉。

希望对你有帮助!:)

于 2013-02-20T22:35:55.823 回答