【问题标题】:How to check if a value in one list is in another list with a one-liner for an if statement in Python if I'm not using sets?如果我不使用集合,如何使用 Python 中的 if 语句检查一个列表中的值是否在另一个列表中?
【发布时间】:2017-12-19 07:22:20
【问题描述】:

我正在尝试构建一个单行,它会检查一个列表中的任何值是否存在于另一个列表中,如果存在或不存在,则返回 True 或 False。

我最接近的是:

[i in list1 for i in list2]

这样做的问题是它将遍历 list1 并根据 list1 中的项目是否存在于 list2 中输出一个 True 和 False 列表。

然后我可以做的是遍历这个新创建的 True 和 False 列表,但我不能在同一行中这样做。在这种情况下,我无法使用集合或导入任何函数,因为我将其用作第三方软件中的条件,您无法在条件中插入集合或使用函数。

【问题讨论】:

  • 到目前为止您尝试过什么?请参阅stackoverflow.com/help/how-to-askstackoverflow.com/help/mcve
  • 我试过 [i in list1 for i in list2] 和 [i for i in list1 if i in list2] 但两者都没有返回我需要的东西。我还研究了使用集合或不在 1 行中执行此操作的不同方法,但是我不能在这里使用这些方法。

标签: python python-2.7 list


【解决方案1】:

假设我们有这个列表:

list1 = ['bar', 'foo', 'qwerty', 9, 1]
list2 = [1, 2, 3, 'foo']

如果我们想看到重复的值:

[i for i in list1 if i in list2]

输入:

['foo', 1]

如果我们想要真假:

(map(lambda each: each in list1, list2))

输入:

[True, False, False, True]

输入正在检查 list2,第一个值 '1' 存在于 list1 中,最后一个值 'foo' 也存在。

【讨论】:

    【解决方案2】:

    你也可以

    set(list1).intersection(list2)
    

    获取出现在两者中的元素集合;如果没有交集,则集合的长度为0,否则为正。您可以将此集合视为布尔值,因为 Python 将空集评估为 False,将非空集评估为 True。

    if set(list1).intersection(list2):
        print ('Lists have elements in common')
    else: 
        print ('No elements in common')
    

    运行时间是 O(n) 平均情况,O(n^2) 最坏情况:https://wiki.python.org/moin/TimeComplexity

    【讨论】:

    • 不幸的是,我不能使用集合,因为它不是我们正在编写脚本的系统的条件标签中接受的表达式,但我可以使用它。
    • 不要 100% 理解您的意思,但如果问题在于将集合视为布尔值,您也可以使用 if len(set(list1).intersection(list2)) > 0:。不过,这有点难看。
    • 此条件正在基于 XML 的系统中实现。在该系统中有 XML 条件属性(cond's),您可以在其中插入评估的实际 Python 条件。这些条件是用 python 编写的,但是在这些条件中可以包含的内容是有限制的,在这种情况下,限制是您不能继续使用 2 行,并且不能在其中使用集合。我希望这是有道理的.
    【解决方案3】:

    您可以使用带有生成器表达式的any(..) 内置函数:

    any(e in list2 for e in list1)
    

    所以这将检查两个列表中是否至少有一个元素出现。

    但是请注意,这将导致最坏情况的 O(n2) 算法。例如,如果元素是可散列的,并且您可以使用 set,我们可以将其设为 O(n) 平均情况算法。

    【讨论】:

    • 实际上完美无缺,刚刚测试过。我知道将整个代码放在一行中会导致性能问题,但不幸的是,这是我唯一可以使用的东西。
    • 如果元素不可散列,这是您可以获得的最佳性能。 O(n^2) 将始终是您最坏的情况,因为无论您以何种顺序遍历列表,总是有可能唯一的共同元素是每个列表的最后一个。 any 足够聪明,可以在找到匹配项后立即停止迭代。
    • 如果元素是可散列的,那么只使用 set !!! ...精彩的答案...
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2023-03-22
    • 1970-01-01
    • 2021-01-19
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多