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

时间:2014-04-03 18:51:46

标签: python list

注意:我使用的是Python 3.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

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

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)或擦除内容。

2 个答案:

答案 0 :(得分:0)

你可能正在寻找这样的东西:

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

这与原始实现略有不同,因为在上述情况下,如果字谜是乱序的话也不重要(也就是说,所有字谜不需要彼此相邻)。

另外,您可以更有效地构建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)

答案 1 :(得分:0)

详细说明亚当·斯密的评论......你可能想要这样的事情:

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

EG。所以,如果你有以下

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

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

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