繁体   English   中英

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

[英]How do I compare and group equivalent items in the same list in Python?

注意:我正在使用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属性。 例如bat和tab都具有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)或擦除事物。

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

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)

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

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] ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM