【问题标题】:Python searching lists with lists, all and anyPython 使用列表搜索列表,所有和任何
【发布时间】:2020-05-28 23:51:21
【问题描述】:

由于某种原因,我在使用某个 if 语句时遇到了麻烦。假设我有三个列表:

list1 = [1,2,3,4,5]
list2 = [1,2,4,5]
list3 = [4,5,6,7,8]

我评估每一个。如果列表同时包含 4 和 5,但没有 2 或 3,我想标记它。我认为这会起作用:

if all(q in [4,5] for q in the_list_name) and not any(q in [2,3] for q in the_list_name)

我希望这只会标记list3。但是,它在所有列表上都返回 false。我想知道我做错了什么?

【问题讨论】:

  • 第一个子句测试每个元素是 4 还是 5,这显然不是任何示例。
  • 您的标志条件听起来不对。 (includes 4 && 5) && !(includes 3 || 4) 简化为 4 && 5 && !3 && !4 总是返回 false,因为它不能同时包含 4 和不包含 4
  • 您希望排除 3 和 4 还是仅排除其中之一? List3 有 4,5 没有 3,和 List2 一样。那么,如果您希望 List3 被标记,为什么不标记 List2?
  • 该死,我试着做一个简单的例子,但在列表中犯了一个愚蠢的错误。这个想法仅仅是第一个列表具有第二个子句的全部或部分,但所有列表都具有第一个子句。一个更好的例子可能是 4 AND 5,但不是 2 OR 3。所以所有列表都有 4 和 5,但只有 list3 没有 2 或 3。
  • @ThomasNicholson 在这种情况下,这应该可以工作:{4, 5}.issubset(lst) and not {2, 3}.intersection(lst)

标签: python list if-statement any


【解决方案1】:

如果我们查看all(q in [4,5] for q in the_list_name),那么只有一半,我们可以看到它为所有列表返回False。该语句实际上测试列表中的所有元素是 4 还是 5。另一个相同,它测试所有元素是 3 还是 4,因此所有元素都是 False 是有意义的。

要正确测试列表是否包含 4 和 5 但不包含 3 OR 4,您可以将代码更改为:

inc = [4, 5]
exc = [2, 3]
testList = lambda l, inc, exc: all(i in l for i in inc) and not any(e in exc for e in l)

有结果:

>>> testList(list1, [4, 5], [2, 3])
False
>>> testList(list2, [4, 5], [2, 3])
False
>>> testList(list3, [4, 5], [2, 3])
True

仔细观察:

  • all(i in l for i in inc): inc 中的所有元素(需要包含的元素)都是给定列表 l 的一部分
  • not any(e in exc for e in l): 对于给定列表 l 中的每个元素,它们都不应该在他的 exc 列表中(需要排除的元素)

编辑:

如果您想使用推荐中的@ekhumoro 答案(更优雅),但也有需要包含/排除的元素的参数,您可以使用:

testList = lambda l, i, e: {*i}.issubset(l) and not {*e}.intersection(l)

【讨论】:

    【解决方案2】:

    一个简单的方法可能是:-

    if ( (4 in _list_name and 5 in _list_name )and (2 not in _list_name or 3 not in _list_name))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2016-06-15
      • 2013-03-06
      • 2022-07-25
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多