从一个单词列表中创建一个anagram列表

2024-05-16 23:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从单词列表中找到创建字谜列表。我应该在代码或递归中使用另一个循环吗?在

some_list = ['bad', 'app', 'sad', 'mad', 'dab','pge', 'bda', 'ppa', 'das', 'dba']

new_list = [some_list[0]]
i = 0
while i+1 < len(some_list):
    if (''.join(sorted(some_list[0]))) == (''.join(sorted(some_list[i+1]))):
        new_list.append(some_list[i+1])
        i = i+1
    else:
        i = i+1

print(new_list)

  • 我的输出是['bad', 'dab', 'bda', 'dba']。但我也想要更多的名单 来自some_list的其他字谜。在

我希望输出是: -['app', 'ppa'] -['bad', 'dab', 'bda', 'dba'] -['sad', 'das']


Tags: app列表newsomedbalistbadsorted
3条回答

我建议您编写Python,而不是Java或您在那里模拟的任何其他语言。以下是Python中的核心代码,有正常的循环,没有所有不必要的东西:

new_list = [some_list[0]]
for word in some_list[1:]:
    if sorted(some_list[0]) == sorted(word):
        new_list.append(word)

我看不出递归有什么用,但是可以,你可以用一个外循环来找到其他的语法组。在


虽然我是这样做的,但是使用有用的itertools.groupby

^{pr2}$

打印出:

['bad', 'dab', 'bda', 'dba']
['sad', 'das']
['app', 'ppa']

对分组进行排序的更改问题的替代解决方案:

groups = (list(group) for _, group in groupby(sorted(some_list, key=sorted), sorted))
print([group for group in sorted(groups) if len(group) > 1])

输出:

[['app', 'ppa'], ['bad', 'dab', 'bda', 'dba'], ['sad', 'das']]

你的问题是你在列表上循环一次,因为你需要基于所有的单词循环。在

但我建议另一种方法来完成此任务,您可以使用itertools.groupby并使用operator.itemgetter排序函数:

some_list = ['bad', 'app', 'sad', 'mad', 'dab','pge', 'bda', 'ppa', 'das', 'dba']

from operator import itemgetter
from itertools import groupby 
s=sorted([(i,''.join(sorted(j))) for i,j in enumerate(some_list)],key=itemgetter(1))
inds= [zip(*g)[0] for _,g in groupby(s,itemgetter(1))]
print [itemgetter(*i)(some_list) for i in inds]

结果:

^{pr2}$

我在这里所做的就是使用sortedenumerate创建一个排序单词列表:

sorted([(i,''.join(sorted(j))) for i,j in enumerate(some_list)],key=itemgetter(1))
[(0, 'abd'), (4, 'abd'), (6, 'abd'), (9, 'abd'), (3, 'adm'), (2, 'ads'), (8, 'ads'), (1, 'app'), (7, 'app'), (5, 'egp')]

然后,我们需要根据第二个元素对这些对进行分组,并获得第一个元素(索引),这样我们将得到以下元组列表:

[(0, 4, 6, 9), (3,), (2, 8), (1, 7), (5,)]

每个元组都包含那些排序表示相同的单词的索引。在

最后,您只需要根据前面的索引提取主列表中的元素:

[itemgetter(*i)(some_list) for i in inds]
[('bad', 'dab', 'bda', 'dba'), 'mad', ('sad', 'das'), ('app', 'ppa'), 'pge']

1)创建一个函数anagrams(word),它将像您的代码一样返回一个单词的一个anagram列表。
2) map单词列表上的函数。在

相关问题 更多 >