2015-05-03 2 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 ] = значение' вместо '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

Смежные вопросы