如何在字典列表中搜索Python字典值的最佳方法?

18

我有以下的数据结构:

  data = [
      {'site': 'Stackoverflow', 'id': 1},
      {'site': 'Superuser', 'id': 2}, 
      {'site': 'Serverfault', 'id': 3}
  ]
我想搜索上述列表,以查看是否有任何具有特定值的站点。例如,搜索以上内容以查看列表是否包含一个站点字典,其中 site='Superuser',并返回 True/False。我可以像通常那样遍历每个项并进行比较来完成上述操作。是否有其他方法来实现搜索?

3
如果数据已排序,则存在优化方法。如果未排序,则只需使用 any() 解决方案。 - Kenan Banks
4个回答

29
any(d['site'] == 'Superuser' for d in data)

9
哇,我们在10秒内发布了完全相同的内容。我想我会删除我的内容。 :( - FogleBird
1
请注意,这正是“循环遍历每个项目并进行比较”的内容,而这正是Thierry Lam不想要的。 - nosklo
我认为他指的是普通的for循环。 - Lukáš Lalinský

9
filter( lambda x: x['site']=='Superuser', data )

6

列表绝对需要循环。这就是列表的作用。

如果要避免循环,就必须避免使用列表。

你需要搜索键和对象的字典。

sites = dict( (d['site'],d) for d in data )
ids = dict( (d['id'],d] for d in data )

现在,您可以使用哈希查找而不是循环来查找与“Superuser”相关联的项目,方法是使用sites [“Superuser”]

1

我不确定Python语法是否适用于您,但它可能以这种方式为您工作。在构建主数据结构的同时,还要构建一个并行的哈希或关联数组,其键是站点名称;然后要查看给定站点是否存在,您可以尝试使用站点名称在哈希中进行查找。如果成功,则知道该站点的数据结构中有记录,并且您已经在哈希查找的时间内完成了它(取决于哈希技术,可能是O(1)或O(log2(n))),而不是列表遍历的O(n / 2)。

(更新时写入:这基本上就是S.Lott发布的内容)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接