将字符串与字符串列表进行比较以在 Python 中查找字谜

Posted

技术标签:

【中文标题】将字符串与字符串列表进行比较以在 Python 中查找字谜【英文标题】:Comparing a string with a list of strings to find anagrams in Python 【发布时间】:2014-11-21 12:33:49 【问题描述】:

我正在尝试研究如何将字符串 (str1) 与字符串列表 (str_list) 进行比较,然后返回 str_list 中作为 str1 字谜的所有字符串的列表。

我之前定义了一个函数来比较两个字符串,如果它们是彼此的字谜,则打印 True,否则打印 False。

def anagram(str1,str2):
      if sorted(str1) == sorted(str2):
             print (True)
      else:
             print (False)

我试图开始定义下一个函数,但我正在努力返回作为字谜的字符串列表。

def find_anagrams_in_word_list(str1, str_list):
     str_list = [] #assumed an empty list has to be made first
     str_list = input
     if sorted(str1) in sorted(str_list):
           #return strings that are anagrams

不确定这是否是我的意思,因为我还是一个初学者,所以任何指针都会非常有帮助!

谢谢。

【问题讨论】:

只是一个旁注.. 但是写 if x: print(True) else: print(False) 与 print(x) 完全一样。在您的情况下,只需编写 print(sorted(str1) == sorted(str2)) 【参考方案1】:

更快的方法是使用collections.Counter

from collections import Counter
def isAnagram(str1, str2):
    return Counter(str1) == Counter(str2)

def find_anagrams_in_word_list(str1, str_list):
    return [word for word in str_list if isAnagram(str1, word)]

请注意,您的 isAnagram 不会像您预期的那样运行,因为您只有 print 的值,而不是 return 它。为了让您能够使用 isAnagram 函数,就像我在上面的列表理解中所做的那样,您必须执行以下操作之一。

def anagram(str1,str2):
    if sorted(str1) == sorted(str2):
        return True
    else:
        return False

或者更简洁

def anagram(str1,str2):
    return sorted(str1) == sorted(str2):

【讨论】:

【参考方案2】:

您可以为此使用生成器,还请注意sorted 函数的结果是一个列表,您需要将其转换为带有''.join() 的字符串,然后进行比较:

def find_anagrams_in_word_list(str1, str_list):
     return [ i for i in str_list if ''.join(sorted(str1)) == ''.join(sorted(i))]

演示:

>>> l =['abcd', 'msnd']
>>> find_anagrams_in_word_list('cba',l)
['abcd']

【讨论】:

我不明白你在做什么。您出于某种原因将输入列表设置为空,然后将其设置为函数,然后尝试对其进行迭代。 ''.join(sorted(str1)) in ''.join(sorted(i)) 无论如何都不是一个有效的字谜测试,因为 'abc''abcd' 中,但它们不是字谜。 这不会产生正确的结果。正如@DSM 所说,它将包含原始单词的子字符串,这些子字符串不是有效的字谜。 @Cyber​​ 我想我对 anagrams 有一些误解!你能解释一下吗? @Kasra 下面是一个字谜示例:“rose”和“sore”。它们以不同的顺序具有相同的字母。 “ore”和“sore”不是字谜,一个只是另一个的子集。 哎呀,谢谢,我只需要将in 更改为==,谢谢@Cyber​​!

以上是关于将字符串与字符串列表进行比较以在 Python 中查找字谜的主要内容,如果未能解决你的问题,请参考以下文章

如何将 unicode 类型与 python 中的字符串进行比较?

__eq__ 方法将两个自定义对象与列表进行比较

将2个列表与特定字符串进行比较

将 Python 子字符串与 char 值进行比较

Python/Pandas:如何将字符串列表与 DataFrame 列匹配

如何通过比较字符串出现的位置来对字符串列表进行排序?