【问题标题】:what is the python syntax for checking two lists (how to use the OR logic expression)检查两个列表的python语法是什么(如何使用OR逻辑表达式)
【发布时间】:2012-01-23 04:05:53
【问题描述】:

我正在尝试检查字典中是否存在项目(键和值)此语法是否正确?

  if item in companies.keys() or companies.values()
       append item

是吗

 if item in (companies.keys() or companies.values())
       append item

还是别的什么?

【问题讨论】:

  • 你在哪里见过像这两个例子这样的代码?是什么让您认为 or 运算符是这样工作的?
  • 如果您正在搜索 dict 的值,您可能使用了错误的数据结构。

标签: python list dictionary


【解决方案1】:

这样试试怎么样?

if (item in companies.keys()) or (item in companies.values()):
    append item

我认为 (x in y) 周围的括号是可选的,因为 or 运算符的优先级较低。

编辑:

但是,使用item in companies.keys() 存在一些效率低下的问题,尤其是在 Python 3 之前的 Python 版本中,其中 .keys() 方法迭代所有键并创建所有键的列表。

可以重写相同的测试以使用更快、更惯用的测试,例如:

if (item in companies) or (item in companies.values()):
    append item

或者,没有括号(虽然我发现它更难阅读):

if item in companies or item in companies.values():
    append item

【讨论】:

  • item in companies.keys() 几乎总是一个坏主意。应该使用item in companies
  • @J.F.Sebastian:在字典的值中搜索几乎总是一个坏主意。 OP的代码有很多问题,包括数据结构的选择。我试图让答案集中在问题上。
  • 顺便说一句,视图对象(.keys() 的结果)似乎在 Python 3 上实现了一个高效的__contains__() 方法。
【解决方案2】:

如果您对大量项目执行检查:

companies_values = set(companies.values())
# ...
for item in items:
    if item not in companies and item not in companies_values:
       # item is not among keys or values of companies
       # add item

不要使用item in companies.keys()

dict.keysdict.values 每次调用它们时都会创建新列表(在 Python 2.x 上)。这是O(N) 操作。在列表中查找项目也是O(N) 操作,其中N 是列表中的项目数。 O(N) 大致表示线性时间,N 越大,所用的时间越长。

另一方面,item in some_dict 是摊销的O(1) 操作(无论字典大小如何,平均时间都是恒定的)。 item in some_set 也一样。

【讨论】:

  • 这取决于 Python 版本。在最近的版本中,.keys().values() 在字典上返回 views 并且生成这些视图不需要副本。
  • @André Caron:除非标签上写着python-3.x,否则答案是关于 Python 2.x。在任何情况下,搜索仍然是 O(N) 而不是 O(1) 用于字典查找。
  • OP 对 SO 来说是新手,问题总是被错误标记。除非 OP 明确说明问题是哪个版本,否则我会避免误导性概括。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2019-07-23
  • 2012-03-22
  • 2020-09-27
  • 2019-01-01
  • 2016-05-18
相关资源
最近更新 更多