2015-05-03 53 views
4

使用Python 3.4如何爲python列表的每個元素實現一個計數器?

我有一種方法可行,但我認爲可能有更好的方法。 我想列出一個方法expand(),它從列表中選擇一個隨機元素,但是每次選擇該元素時,計數器都會增加。我嘗試子類str能夠添加屬性,但它不起作用。

我得到的主要問題是表達式random.randint(0,len(self)-1)和使用局部變量似乎不是Pythonic。之前,我添加了計數器,我可以只輸入random.choice(self)

class clauses(list): 
    def __init__(self): 
     self.uses = [] 

    def __setitem__(self,key,value): 
     self.uses[key]=value 
     super().__setitem__(self,key,value) 

    def __delitem__(self,key): 
     del(self.uses[key]) 
     super().__delitem__(key) 

    def append(self,value): 
     self.uses.append(0) 
     super().append(value) 

    def extend(self,sequence): 
     for x in sequence: 
      self.uses.append(0) 
      super().append(x) 

    def expand(self): 

     n = random.randint(0,len(self)-1) 

     self.uses[n] += 1 
     return(self[n]) 
+0

如果某個特定元素被刪除,計數器會發生什麼? – thefourtheye

+0

而不是'random.randint(0,len(self) - 1)'use'random.randrange(0,len(self))',自從Python 1.5.2以來一直存在 –

+0

應該'self.uses [key ] = value'而不是'self.uses [key] = 0'?看來,否則你正在將計數器設置爲列表中的值...... – 6502

回答

1

初始化一個空的字典,用你的列表一起應該解決這個問題,假設有在列表中沒有重複的條目。

將元素添加到列表中時,還可以通過myDict[element]=0將其添加到字典中,其中myDict是已初始化的字典,而element是要添加到列表中的項目。

然後,當選擇該項目時,您可以簡單地執行:myDict[element]+=1

在處理重複條目的實例時,可以創建一個詞典詞典,其中詞典中的每個key都是一個詞,每個詞的嵌套詞典keys是重複詞的索引位置(例如,當然值是實際計數)。但是,這會增加實質性的複雜性,因爲當您從列表中刪除某個項目時,還需要更新索引位置。這種嵌套的數據結構會喜歡這樣的事情:{ word1: {position1: count1}, word2: {position1: count1, position 2: count2}....}

+1

謝謝@FortyLashes,我認爲字典是要走的路。現在我已經考慮過了,重複的行爲會沒問題,因爲這是一個短語元素被使用了多少次的計數器。如果每次添加新元素時都創建一個新的密鑰,並且只要在其他時間增加計數器,就應該可以工作。事實上,它應該更好地工作! –

+0

@JamesWilson請接受我的答案是解決您的問題。 – DMML

相關問題