【问题标题】:Check if list of 'partial' strings is in list of full strings检查“部分”字符串列表是否在完整字符串列表中
【发布时间】:2015-09-18 13:45:58
【问题描述】:

对不起标题,实在想不出一个简单的方法来解释这种情况。

所以如果我有一个字符串列表,例如:

list_1 = [ "cat", "rat", "mat" ]

我如何检查所有这些字符串是否在另一个可能有“绒毛”的列表中(我的意思是,与其说“cat”,不如说它可能有“cat_mittens”,这很好,但是“car_mittens” " 不是)。

例如:

list_A = [ "cat", "car", "cab" ]
list_B = [ "cat", "rat", "bat", "mat" ]
list_C = [ "cat_mittens", "rat", "mat" ]

在这里,如果我对 list_A 进行分析,我希望返回 False,对于 list_B,我希望返回 True,同样对于 list_C,我希望返回 True(因为它包含所有 3列表 A 的字符串,即使 "cat" 周围有额外的位(我称之为绒毛)。

我目前的做法是:

list_1 = [ "cat", "rat", "mat" ]
list_C = [ "cat_mittens", "rat", "mat" ]

temp_list = [False,] * 3

count = 0
for temp_1 in list_1:
  temp_list[ count ] = any( temp_1 in temp_2 for temp_2 in list_C )
  count += 1

result = all( temp_list )

还有一个复杂的问题是,在我的实际代码中,列表 C 中的所有字符串都需要包含一个额外的字符串(例如,所有都需要说“_filetype”)但这不是一个问题(我在最后一个“全部”声明)。

我的方法有效,但在我看来它很混乱(尤其是因为我将事物称为 temp,因此可能不清楚是什么。我想我可以将它们重命名为其他名称,但我想我可以'想不出任何有意义的名字来命名它们),我不确定它的效率到底有多高。

还有其他方法可以实现吗?

对不起,如果我没有很好地解释这一点!如果有什么需要澄清的,请告诉我。

【问题讨论】:

  • 你想为["ratcatmat"]返回什么?
  • 你的问题可能很适合codereview.SE
  • 我不知道 codereview.SE,但将来肯定会在那里发布此类问题,所以感谢您让我知道!

标签: python string algorithm list python-3.x


【解决方案1】:
def check_all(substrings, strings):
    """Check all *substrings* are in *strings*."""
    return all(any(substr in s for s in strings) for substr in substrings)

例子:

>>> list_1 = [ "cat", "rat", "mat" ]
>>> list_A = [ "cat", "car", "cab" ]
>>> list_B = [ "cat", "rat", "bat", "mat" ]
>>> list_C = [ "cat_mittens", "rat", "mat" ]
>>> check_all(list_1, list_A)
False
>>> check_all(list_1, list_B)
True
>>> check_all(list_1, list_C)
True
>>> check_all(list_1, ["ratcatmat"])
True
>>> check_all(["bc", "ab"], ["abc"])
True

【讨论】:

  • 这是一种相当不错的方法,当然拥有它的功能可能更容易澄清正在发生的事情(即使其更通用,而不是陷入应用程序中)。跨度>
【解决方案2】:

您不必将结果保存在列表中,您可以这样做

result = True
for s in list_1:
    result &= any(s in test_string for test_string in list_C)
print result

如果你这样做,这可以提高效率(但不太干净):

def check(list_1, list_2):
    for s in list_1:
        if not any(s in test_string for test_string in list_C):
            return False
    return True

编辑:

&= 语法只对两个变量执行 AND 操作

所以这个

x &= y

等价于这个

x = x & y 

只有当 x 和 y 都为真时,x 才会为真

所以如果y=True 和x=True 那么结果将为True,但如果例如y=False 那么结果将为False

【讨论】:

  • 哦,我以前没有遇到过语法“&=”。你有没有机会简单解释一下它是如何工作的?我试着搜索它,但因为它只是符号,这并不容易啊哈
  • @Steve:输入help('&=')
  • 谢谢! (不得不说,我用 Python 一年多了,没有意识到它有一个内置的帮助功能/文档,有点尴尬)
  • 我会将它添加到未来观众的答案中
  • 相当不错的方法, &= 导致它只能从 True 更改为 False 而不能返回。
【解决方案3】:

你可以在 python3 中做到这一点。这应该会打印出想要的结果。

list_1 = [ "cat", "rat", "mat" ]
list_2 = [ "cat_mittens", "rat", "mat" ]

for i in list_2:
    for j in list_1:
         if j in i:
            print(i) 

我希望这是你想做的。

【讨论】:

    【解决方案4】:
    count = 0
    for item in list_1:
        for item2 in list_C:
            if item in item2:
                count += 1
                break
    res = 'True' if count==len(list_1) else 'False'
    print res
    

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2013-04-29
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多