【问题标题】:In Python, how do I check a string to see if any combinations of another string are in it? [duplicate]在 Python 中,如何检查一个字符串以查看其中是否包含另一个字符串的任何组合? [复制]
【发布时间】:2025-12-01 23:55:01
【问题描述】:

我有一个 170 000 个单词列表,我正在编写一个算法,使用每个单词的图表来查看可能的最长单词链;

单词链是一个单词列表,其中第 i 个单词是第 (i - 1) 个带有一个额外字符的单词,其他字符以任何方式排列

A -> AN -> CAN -> 手杖

现在我按字母顺序列出了所有单词,例如 CAT = ACT

我说当字符串 2 包含字符串 1 加上一个其他字符时添加一条边

但是在

的情况下

A-> AT -> ACT

未绘制 AT 和 ACT 之间的边,因为 C 将 A 和 T 分开,并且我的 if 语句仅在找到“AT”时才有效。

我如何告诉 python 搜索一个字符串,这样字符的顺序就无关紧要了?

【问题讨论】:

  • 你关心字符串中的重复字符吗?比较 caat 和 act 时的示例。
  • 您可以尝试按字母顺序排序。
  • 如果顺序根本不重要,请使用Counter 而不是字符串。然后你可以采取多重交叉路口。

标签: python string algorithm parsing nodes


【解决方案1】:

您可以创建一组两个字符串:

set1 = set(string1)
set2 = set(string2)

然后查看string1 是否包含string2 中的所有内容

set1.issubset(set2) # => returns True if set2 contains everything from set1

【讨论】:

  • 我喜欢我整天在 python 中使用集合,从没想过要设置一个字符串。不错。
  • 请注意这将匹配 CAATACT ,不确定它们是否应该匹配。
  • 我在 OP 之前的重复问题中建议了这种确切的方法,并被正确告知它不起作用。
【解决方案2】:

您可以使用collections.Counter 并将两个字符串都转换为它(它会计算字符串中的字母),然后您可以比较它是否相等。示例 -

s1 = 'ACT'
s2 = 'CAT'
from collections import Counter
if Counter(s1) == Counter(s2):
    #Do stuff

演示 -

>>> s1 = 'ACT'
>>> s2 = 'CAT'
>>> from collections import Counter
>>> Counter(s1) == Counter(s2)
True

如果你想检查一个字符串是否包含在另一个字符串中而不关心顺序,你可以使用any() 内置函数如下 -

s1 = 'AXCT'
s2 = 'CAT'
A = Counter(s1)
B = Counter(s2)
if not any(count > A.get(b, 0) for b,count in B):
    #Do stuff.

或者您也可以执行以下操作(如@Kevin in the comments 所示)-

s1 = 'AXCT'
s2 = 'CAT'
A = Counter(s1)
B = Counter(s2)
if (B & A) == B:
    #Do stuff

【讨论】:

  • 可能还想演示如何使用&(即A & B == A)检查子集。
  • 有趣,它对我有用。试试Counter('ACT') & Counter('ACTE') == Counter('ACT');我在 3.4.3 中得到 True。
  • @Kevin 哦,是的,A 是子集。
  • 希望反对者解释答案有什么问题,只有这样我才能修复答案。
  • 什么版本的 Python?
【解决方案3】:
str1 = 'A'
str2 = 'T'
searchstring = 'ACT'

if str1 in searchstring and str2 in searchstring:
    print('it matched')


# bigger example

str1 = 'AT'
searchstring = 'ACT'
matches = [a for a in str1 if a in searchstring]
if len(matches) == len(searchstring):
    print('it matched')

【讨论】:

  • 构造matches 是字符串长度的二次方,假设两个字符串的长度相似。其他答案更高效。
  • 不会从我这里得到任何论据。
【解决方案4】:

您可以将较长的字符串转换为正则表达式,然后进行匹配。一个简单的方法是让所有字符都是可选的,首先检查目标字符串是否长了一个字符:

def can_reach(frm, to):
  if len(to) != len(frm) + 1: return False
  if not re.fullmatch(re.sub(r'(.)', r'\1?', to), frm): return False
  return True

如果您没有 Python 3.4,则使用显式 $ 锚点:

def can_reach(frm, to):
  if len(to) != len(frm) + 1: return False
  if not re.match(re.sub(r'(.)', r'\1?', to) + '$', frm): return False
  return True

【讨论】: