簡體   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