【问题标题】:How to check if a set of strings contains another string, without using any function?如何在不使用任何函数的情况下检查一组字符串是否包含另一个字符串?
【发布时间】:2020-07-16 16:52:02
【问题描述】:

最近,我开始在我的代码中使用集合,我想知道如何知道一个字符串是否在其他字符串中,只使用 sets 而不是可迭代函数 any 我想出的例子是像这样的

    set1 = set({"nb","np"})
    word = "rainbow"
    if any(i in word for i in set1):
        print("not a spanish word")
    else:
        print("probably a spanish word")

所以如果set1的元素增加了(比如加了一个“mm”),那么会因为函数any的迭代次数增加而影响耗时,如果你做一组word字母顺序的信息丢失了,因为该新集合的元素将是单词的字母,在这种情况下,您将不知道 set1 中的字符串是否实际上在单词内部,或者至少我是这么认为的.

【问题讨论】:

  • 你的问题是什么?
  • 没有any功能怎么办
  • 您想在没有any 的情况下这样做,因为您认为它效率低下?我很确定你不会变得更好,因为实际的复杂性不能降低很多。
  • 并不是我认为 any 效率低下,而是我认为应该有办法做到这一点,只使用集合
  • 基于Python documentation of any()any() 将在可迭代对象产生真正的元素时立即返回(即短路),因此它应该非常有效。

标签: python string set


【解决方案1】:

正如 cmets 中所说,any 无论如何都会更好,但如果您只想使用集合,这可能是一种方法:

set1 = set({"nb","np"})
word = "rainbow"
slicedword=set([word[i:i+2]for i in range(len(list(word))-1)])
if len(slicedword.intersection(set1))>=1:
    print("not a spanish word")
else:
    print("probably a spanish word")

通用解决方案 (针对set1的不同长度的元素)

set1 = set({"nb","np","mmm"})
word = "rainbow"
for i in set1:
    n=len(i)
    slicedword=set([word[i:i+n]for i in range(len(list(word))-(n-1))])
    print(slicedword)
    if len(slicedword.intersection(set1))>=1:
        print("not a spanish word")
        break
else:
    print("probably a spanish word")

说明:

首先,我们将word 分割成与set1 的子串大小相同的块,在这种情况下,对于set1 中的所有单词,该块大小为2:

set1 = set({"nb","np"})
word="rainbow"
slicedword=set([word[i:i+2]for i in range(len(list(word))-1)])
slicedword
>>>{'in', 'ow', 'ra', 'bo', 'nb', 'ai'}

然后您执行set.intersection 并评估交叉点的长度是否等于或大于 1,这意味着您至少有一个匹配项。

slicedword.intersection(set1)
>>>{'nb'}

len(slicedword.intersection(set1))
>>>1

len(slicedword.intersection(set1))>=1
>>>True

【讨论】:

  • 看来迭代过程无论使用any还是for都是不可避免的。但我想创建一个集合本身就是一个迭代过程,所以我想知道是否有一个自定义函数可以像你一样创建具有自定义长度元素的字符串集,是否值得在 python 中添加。
  • 是的,这是肯定的,我认为您必须在任何选项中使用迭代过程。当然,您可以创建一个自定义函数来返回分块的单词,这将使代码更清晰,事实上,如果我还不错的话,有一些库可以将字符串分块的过程。但对我来说,你原来的解决方案是做你想做的最好的方式。
猜你喜欢
  • 2021-05-06
  • 2013-03-13
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多