在python中编辑字符串以查找字谜[重复]

Posted

技术标签:

【中文标题】在python中编辑字符串以查找字谜[重复]【英文标题】:String editing in python to find anagrams [duplicate] 【发布时间】:2013-03-04 11:59:00 【问题描述】:

给定字符串... able\nacre\nbale\nbeyond\nbinary\nboat\nbrainy\ncare\ncat\ncater\ncrate\nlawn\nlist\nrace\nreact\nsheet\nsilt\nslit\ntrace\n

我试图弄清楚如何将字符串中的每个单词分配给一个变量,然后按字母顺序对每个单词进行排序,这将允许我比较它们以查看哪些是字谜,哪些不是。我有大约一个月的 Python 经验,如果可以的话,一切都变得愚蠢。

【问题讨论】:

不要将每个单词分配给变量。而是将所有单词分配给一个列表。 到目前为止你尝试过什么?发布代码来展示你在做什么总是能得到更好的答案,因为它表明你在尝试,而不是仅仅为了一个简单的答案。 你以前问过这个问题,我不明白再问一次有什么帮助。此外,您不会在没有自己尝试的情况下简单地通过索取代码来获取代码。 请更新您的第一个问题以改进它,请不要一遍又一遍地重新发布相同的问题。 【参考方案1】:

您应该将它们全部保存到一个列表中,而不是将每个单词保存到一个变量中。以下是我处理完整问题的方法:

from itertools import groupby
from operator import itemgetter

s = 'able\nacre\nbale\nbeyond\nbinary\nboat\nbrainy\ncare\ncat\ncater\ncrate\nlawn\nlist\nrace\nreact\nsheet\nsilt\nslit\ntrace\n'
words = s.strip().split()
sorted_words = (''.join(sorted(line)) for line in words)
grouped = sorted((v, i) for i, v in enumerate(sorted_words))
anagrams = [[words[i] for v, i in g] for k, g in groupby(grouped, itemgetter(0))]

结果:

>>> import pprint
>>> pprint.pprint(anagrams)
[['able', 'bale'],
 ['binary', 'brainy'],
 ['boat'],
 ['acre', 'care', 'race'],
 ['cater', 'crate', 'react', 'trace'],
 ['cat'],
 ['lawn'],
 ['beyond'],
 ['sheet'],
 ['list', 'silt', 'slit']]

【讨论】:

【参考方案2】:
In [27]: s = 'able\nacre\nbale\nbeyond\nbinary\nboat\nbrainy\ncare\ncat\ncater\ncrate\nlawn\nlist\nrace\nreact\nsheet\nsilt\nslit\ntrace\n'

In [28]: words = s.split()

In [29]: [''.join(sorted(w)) for w in words]
Out[29]: 
['abel',
 'acer',
 'abel',
 'bdenoy',
 'abinry',
 'abot',
 'abinry',
 ...

【讨论】:

我认为 OP 想要对每个单词进行“排序”(今天有一个家庭作业),以检测字谜。 @MartijnPieters:这更有意义。已更正。 不知道为什么你的第一个版本被否决了。 @MartijnPieters:可能是因为我误解了这个问题:) 非常感谢您的帮助。现在我有名单.. ['abel', 'acer', 'abel', 'bdenoy', 'abinry', 'abot', 'abinry', 'acer', 'act', 'acert', ' acert', 'alnw', 'ilst', 'acer', 'acert', 'eehst', 'ilst', 'ilst', 'acert'] 我正试图找出一种方法来编写一个函数遍历列表,并计算出每个排序的单词在列表中出现的次数。有什么想法可以用 def 函数做到这一点吗?【参考方案3】:

你可以yourstring.split('whattosplitat')。在这种情况下,那将是

l='able\nacre\nbale\nbeyond\nbinary\nboat\nbrainy\ncare\ncat\ncater\ncrate\nlawn\nlist\nrace\nreact\nsheet\nsilt\nslit\ntrace\n'.split('\n')

然后您可以执行l.sort(),它将按字母顺序对您的列表进行排序。

【讨论】:

【参考方案4】:
s = 'able\nacre\nbale\nbeyond\nbinary\nboat\nbrainy\ncare\ncat\ncater\ncrate\nlawn\nlist\nrace\nreact\nsheet\nsilt\nslit\ntrace\n'
words = sorted(s.split('\n')[:-1]) # the last one will be '', so you want to get rid of that

测试一个字符串是否是另一个字符串的变位词:

def isAnagram(a, b):
    aLtrs = sorted(list(a)) # if a='test', aLtrs=['e', 's', 't', 't']
    bLtrs = sorted(list(a)) # same as above
    return True if aLtrs==bLtrs else False

【讨论】:

isAnagram("aab", "abb") 为我返回True,但我希望False @Kevin 这将只处理具有唯一字母的单词(每个单词只有一个)......但是,您可以使用不同的方法;我将编辑我的答案。

以上是关于在python中编辑字符串以查找字谜[重复]的主要内容,如果未能解决你的问题,请参考以下文章

算法:按字典顺序在给定索引处查找给定字符串的字谜

使用python中的递归解决方案在字符串列表中查找字谜

Python:字谜查找器

如何对文本文件进行排序以在 O(MN) 时间复杂度中查找字谜,其中 M 是最大字符数,N 是单词数?

在给定的字符串列表中查找字符串的所有字谜

正则表达式 - 查找字谜和子字谜