如何在Python中比较和分组同一列表中的等效项?

2024-06-28 11:25:24 发布

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

注意:我使用的是python3.4

我目前有一个包含以下对象的列表:

class word(object): #object class

    #each word object has 3 attributes (self explanatory)
    def __init__(self, originalWord=None, azWord=None, wLength=None):
        self.originalWord = originalWord
        self.azWord = azWord    #the originalWord alphabetized
        self.wLength = wLength

我想遍历整个列表,看看两个连续的项是否具有相同的azWord属性。例如,bat和tab都会有azWord“abt”,所以它们都是anagrams。最终的目标是将anagrams分组并打印到一个文件中。列表按单词长度分组,每个列表按每个对象的单词字母顺序排列。如果单词是anagrams,我想把它们添加到一个临时列表中。我想通过比较我正在查看的当前项目和下一个项目来实现这一点。如果它们相同,我想将它们添加到临时列表中。当我遇到一个不再相同的项目时,我想将我的字谜集合打印到一个文件中,并开始一个新的临时列表以继续检查字谜。到目前为止,我已经做到了:

for row in results:
    for item in row:
        if <<current item is identical to next time>>:
            tempList = []   
            <<add to tempList>>
        else
            tempList[:]=[]

我不太清楚如何构造这样的结构,使内容不会被写入两次(例如cat、tab、tab、abt)或在打印到文件之前删除内容。你知道吗


Tags: 文件项目对象selfnone列表object单词
2条回答

你可能在找这样的东西:

from collections import defaultdict
anagrams = defaultdict(list)
for word in results:
    anagrams[word.azWord].append(word)

这与您最初的实现稍有不同,因为在上面的情况下,如果anagram无序(也就是说,所有anagram不必紧挨着彼此)。你知道吗

另一方面,您可以更有效地构建word类,如下所示:

# As a convention in python, class names are capitalized
class Word(str):
    def az(self):
        return ''.join(sorted(self))

那么你的代码会是这样的:

from collections import defaultdict
anagrams = defaultdict(list)
for word in results:
    anagrams[word.az()].append(word)

详细阐述亚当·斯密的评论。。。你可能想要这样的东西:

import itertools
list_of_words.sort( key = lambda i: i.azWord )
[ list(items) for azword,items in itertools.groupby( x, lambda i: i.azWord )]

所以如果你有以下的话

x = [ x1, x2, x3, x4 ]  # where x1 & x4 have the same azWords

然后您将得到所需的分组(根据azWord排序):

[ [x1,x4], [x2], [x3] ]

相关问题 更多 >