将字符串与字符串列表进行比较以在 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 中的字符串进行比较?