【问题标题】:How do I test if a list slice matches a set of values in any order?如何测试列表切片是否以任何顺序匹配一组值?
【发布时间】:2018-04-25 00:00:28
【问题描述】:

例如,如果我有一个类似 [a,b,c,d] 的列表,并且我需要检查索引 1,2 处的元素是 b 还是 c,那么它将是正确的。例如,在 [a,b,c,d] 中,在索引 1 处有一个“b”,在索引 2 处有一个返回 true 的“c”。但是,如果这些索引中的元素不是 b 和 c 的组合,则为 false。所以在索引 1 和 2 中必须有一个“b”或“c”,不能是(b 和 b)或(c 和 c)。我不确定如何比较这个.. 有什么提示吗?

[a,b,c,d] 为 True,因为索引 1 和 2 中的元素包含 b 或 c 的组合

【问题讨论】:

  • ['True' for e in l if l[1]=='b' and l[2]=='c']
  • 到目前为止你尝试过什么?请发布您的代码
  • 能否更正格式并添加代码?
  • @sharatpc 但它必须是可互换的。 l[1] 可以是 c 而 l[2] 是 b
  • lookup = ['b','c'] ['True' for e in l if l[1] in lookup and l[2] in lookup]

标签: python list compare slice


【解决方案1】:

对此的一般解决方案是使用集合成员资格。所以你可以这样做:

s = set(vals[1:3])
if s == set(["b", "c"]):
    ...

这将从vals[1]vals[2] 创建一个集合,并检查该集合是否完全包含元素"b""c"

【讨论】:

  • 大智若愚哈哈。我知道这种方法,但是还有另一种不使用集合的方法吗?
  • 另一种方法是创建一个列表切片,对其进行排序,并将其与排序的参考列表进行比较。大型列表的速度较慢,但​​它会起作用。
  • 你能澄清一下吗?比较已排序的参考列表是什么意思?
  • if sorted_list == ["b", "c"],其中["b", "c"] 是排序后的参考列表。您只需要保证它已排序,以便您可以比较是否相等。但是为什么你更喜欢这个而不是使用集合呢?使用集合,您有一个 O(n) 解决方案。通过排序,这增加到 O(n*log(n))。
【解决方案2】:

您可以为此使用Counter,假设您感兴趣的类型是可散列的。

from collections import Counter

def check_counts(l, compare_to):
    return Counter(l) == Counter(compare_to)

l = ['a', 'b', 'c', 'd']
print(check_counts(l[1:3], ['c', 'b']))

这类似于使用set 的解决方案,但允许您关心某个元素的数量的情况

【讨论】:

    【解决方案3】:

    给定项目列表和要匹配的切片:

    items = ['a', 'b', 'c', 'd']
    match = ['b', 'c']
    

    你只需要:

    matches = items[1:3] in (match, match[::-1])
    

    注意:match[::-1] 返回 match 的反转版本。

    基于集合的替代版本:

    match = set(('b', 'c'))
    
    # Version 1
    matches = match.intersection(items[1:3]) == match
    
    # Version 2
    matches = not match.difference(items[1:3])
    

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 1970-01-01
      • 2013-09-27
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2011-02-25
      • 2020-12-08
      相关资源
      最近更新 更多