如何为 python 列表的每个元素实现一个计数器?
How to implement a counter for each element of a python list?
使用Python3.4
我有一个可行的方法,但我认为可能有更好的方法。
我想要一个列表,其方法 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])
假设列表中没有重复的条目,初始化一个空字典和您的列表应该可以解决这个问题。
添加元素到列表时,也可以通过myDict[element]=0
添加到字典中,其中myDict
是初始化的字典,element
是要添加的项列表。
然后,当项目被选中时,你可以简单地做:myDict[element]+=1
。
在处理重复条目的实例时,您可以创建一个字典字典,其中字典中的每个 key
都是一个单词,每个单词的嵌套字典 keys
是,比如,重复词的索引位置(当然是实际计数的值)。然而,这确实增加了相当大的复杂性,因为当您从列表中删除一个项目时,您还需要更新索引位置。这个嵌套的数据结构会像这样:{ word1: {position1: count1}, word2: {position1: count1, position 2: count2}....}
使用Python3.4
我有一个可行的方法,但我认为可能有更好的方法。
我想要一个列表,其方法 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])
假设列表中没有重复的条目,初始化一个空字典和您的列表应该可以解决这个问题。
添加元素到列表时,也可以通过myDict[element]=0
添加到字典中,其中myDict
是初始化的字典,element
是要添加的项列表。
然后,当项目被选中时,你可以简单地做:myDict[element]+=1
。
在处理重复条目的实例时,您可以创建一个字典字典,其中字典中的每个 key
都是一个单词,每个单词的嵌套字典 keys
是,比如,重复词的索引位置(当然是实际计数的值)。然而,这确实增加了相当大的复杂性,因为当您从列表中删除一个项目时,您还需要更新索引位置。这个嵌套的数据结构会像这样:{ word1: {position1: count1}, word2: {position1: count1, position 2: count2}....}