【问题标题】:Python look for matching in listsPython 在列表中查找匹配项
【发布时间】:2017-01-31 08:24:28
【问题描述】:

假设有一个名为PatternList = ['b', 0, 'e', 0] 的列表。如何检查另一个列表CompareList = ['r', 't', 'y', 'b', 'i', 'e', 'y', 'b', 't', 'e', 'r', 't', 'b', 'w', 't', 'e'] 中是否包含PatternList 中包含的模式,以及包含多少次?

在这种情况下,结果将为 2,因为 CompareList = ['r', 't', 'y', 'b', 'i', 'e'' , y, 'b', t, 'e', 'r', 't', 'b', 'w', 't' , 'e'].

注意:PatternList 可以读作“b”,任何字符,“e”,任何字符。

【问题讨论】:

  • 我不确定是否有人知道您的要求,因为您说您想查看该模式是否在第二个列表中,但是如果任何值出现在第二个列表中,看起来您想要列表
  • 0 表示任何字符?如果PatternList = ['b', 'i', 'b', 't' ] 怎么办?
  • 模式和比较列表的元素是否总是由单个字符组成?现在,您的示例代码甚至不是有效的 Python,因此很难猜出您真正要查找的内容。
  • @dnit13 是的,0 表示任何字符,但只有一个。使用第二个 Patternlist,我的 CompareList 中将没有匹配项
  • 根据下面的评论,您的实际问题与您发布的琐碎案例有很大不同。请编辑您的问题并提供Minimal, Complete, and Verifiable example - 以及您自己所做的任何尝试,以便我们知道您到底卡在哪里。

标签: python list pattern-matching comparison


【解决方案1】:

你可以用正则表达式做这样的事情:

import re

l = ["b", "0", "e", "0"]
cl = ["r", "t", "y", "b", "i", "e", "y", "b", "t", "e", "r", "t", "b", "w", "t", "e"]

print re.findall(''.join(l).replace('0','.'), ''.join(cl))
print len(re.findall(''.join(l).replace('0','.'), ''.join(cl)))

输出:

['biey', 'bter']
2

想法:

  1. 加入l 中的元素并将0 替换为. 以匹配cl 中的任何字符。
  2. 加入cl中的元素。
  3. re.findall(res_of_step1, res_step_2)

【讨论】:

  • 您的略有不同,将 0 视为 int。你也可以''.join(map(str, a)).replace('0','.')
  • @MYGz 这看起来不错,但我收到此错误:“AssertionError:抱歉,但此版本仅支持 100 个命名组”。有解决办法吗?
  • hmm.. 我们这里没有使用任何组。你能包括完整的错误回溯吗?或者您的模式列表中可能包含()。如果有任何括号,则必须在模式列表中对其进行转义。
  • @MYGz 没错。我正在处理一个元组列表,每个元组都是图像中的一个像素(R,G,B,A)。我真正的 RefList 看起来像 [(0, 0, 0, 0), (206, 207, 207, 255), (204, 204, 204, 255), (0, 0, 0, 0)]。如果 RefList[1] 将返回 (206, 207, 207, 255)
  • 这是XY problem。你应该用完整的上下文来问这个问题。用清晰的解释编辑您的问题,并提及您的目标以及您尝试过的内容。
【解决方案2】:

当您将其转换为正则表达式时,这看起来很简单:

a=['b', 0, 'e', 0]
a1 = ['.' if i==0 else i for i in a]
>>> a1
['b', '.', 'e', '.']
>>> a2 = ''.join(a1)
compareList = ['r', 't', 'y', 'b', 'i', 'e', 'y', 'b', 't', 'e', 'r', 't', 'b', 'w', 't', 'e']
>>> compare_string=''.join(compareList)
>>> len(re.findall(a2, compare_string))
2

【讨论】:

    【解决方案3】:

    这是你的想法吗?您可以使用列表推导:

        >>> x = [1,2,3]
        >>> y = [0,2,5,7,4,3]
        >>> [i for i in x if i in y]
        [2, 3]
    

    编辑:

    >>> len(set([i for i in x if i in y]))
    2
    >>> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多