【问题标题】:Python - check if value exists in two separate lists [duplicate]Python - 检查值是否存在于两个单独的列表中[重复]
【发布时间】:2018-10-24 21:05:50
【问题描述】:

我创建了以下函数

list1 = [6,2,3,8,1]
list2 = [9,3,5,2,1]

def value_in_both(list1,list2,value):
    return value in list1 and value in list2

value_in_both(list1,list2,value)

代码似乎可以工作,并且基本上通过返回 True 或 False 来显示函数中输入的值是否存在于两个列表中。但是,我问自己,是否没有更有效或不同的方法来解决该问题。是否存在特定的预定义功能?尝试了其他一些不起作用的方法,到目前为止找不到功能。

干杯

【问题讨论】:

  • 为什么会有一个预定义的函数呢?正如您所证明的那样,该语言允许您自己在一行中定义它。
  • set(list1)&set(list2)
  • @mad_ 以及如何测试特定外部价值的成员资格?
  • @mad_ 为什么要计算整个交集?为什么要为一次会员资格测试制作两套?
  • 如果只执行一次测试,没有什么比value in list1 and value in list2 更快的了。如果重复此操作,则可能会根据问题中未提供的信息进行优化。无论如何,除非需要,否则不应进行优化! (谷歌“过早优化”)

标签: python


【解决方案1】:

你可以使用

intersection = set(list1).intersection(list2) 

在两组之间具有共同的值, 然后就可以看到了

if value in intersection

【讨论】:

  • 这比 value in list1 and value in list2 慢,因为它必须遍历两个列表,然后计算交集,然后散列 value
【解决方案2】:

如果您经常进行此检查,请保留两组以进行 O(1) 成员资格测试。

set1 = set(list1)
set2 = set(list2)

不要不要在每次调用函数时在函数内部创建这些集合,创建集合是 O(n) 操作!

检查值v 是否在这两个集合中的最快方法是v in set1 and v in set2

另一种可能性是v in set1 & set2,但set1 & set2 在这里不必要地计算两个集合的完全交集。

如果您想继续阅读,这里是内置数据结构的 Time Complexity Reference

编辑:对于非常小的列表,v in list1 and v in list2 仍有可能优于集合。但是,列表将没有机会包含很多元素。您需要自己对实际数据结构进行一些计时。

【讨论】:

  • 如果 list1 和 list2 是常量,那么可以,但是如果它们是可变的,那么您必须创建不同的集合
  • @mad_ 是的,但如果顺序和重复元素无关紧要,也许可以在整个代码中使用set1set2 而不是列表。
  • 定义函数的重点是使用变量列表,否则不需要定义函数
  • @mad_ 再次指出,OP 可以通过使用两组作为其函数的输入来提高效率。如果他必须有两个列表,可能会或可能不会发生变异,那么集合不适用。
  • 感谢您的评论。我不明白我将如何在我的函数中实现它。据我了解,我将两个列表都定义为集合。 O(n) 是什么意思?抱歉,我对 Python 很陌生..
【解决方案3】:

你所拥有的看起来很棒 :) 你可以使用集合,但是从一个列表构造一个集合是 O(n),所以除非你要做的不仅仅是这个检查,否则它是不值得的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 2017-08-22
    • 2021-12-02
    • 2019-05-28
    • 1970-01-01
    • 2012-07-10
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多