2015-09-12 5 views
0

Я пытаюсь написать функцию, которая будет подсчитывать количество дубликатов слов в строке и затем возвращать это слово, если количество дубликатов превышает определенное число (n). Вот то, что я до сих пор:Python - подсчет повторяющихся строк

from collections import defaultdict 

def repeat_word_count(text, n): 
    words = text.split() 
    tally = defaultdict(int) 
    answer = [] 

    for i in words: 
    if i in tally: 
     tally[i] += 1 
    else: 
     tally[i] = 1 

Я не знаю, куда идти отсюда, когда дело доходит до сравнения словаря значений п.

Как это должно работать: repeat_word_count ("один один был скакун два два был один слишком", 3) должен возвращать [ 'один']

+0

Вы хотите, чтобы «словарь» как результат с «ключом» - это 'count' и' value' слово? Это то, что вы пытаетесь получить?Итак, если есть слово без дубликатов, 'key' будет' 1', и если будут дубликаты, 'key' будет числом для количества дубликатов? –

ответ

0

Вот способ сделать это:

from collections import defaultdict 
tally = defaultdict(int) 
text = "one two two three three three" 
for i in text.split(): 
    tally[i] += 1 
print tally # defaultdict(<type 'int'>, {'three': 3, 'two': 2, 'one': 1}) 

Включая это в af :

def repeat_word_count(text, n): 
    output = [] 
    tally = defaultdict(int) 
    for i in text.split(): 
     tally[i] += 1 
    for k in tally: 
     if tally[k] > n: 
      output.append(k) 
    return output 

text = "one two two three three three four four four four" 
repeat_word_count(text, 2) 
Out[141]: ['four', 'three'] 
2

Try

for i in words: 
    tally[i] = tally.get(i, 0) + 1 

вместо

for i in words: 
    if i in tally: 
     tally[words] += 1 #you are using words the list as key, you should use i the item 
    else: 
     tally[words] = 1 

Если вы просто хотите сосчитать слова, используйте collections.Counter в порядке.

>>> import collections 
>>> a = collections.Counter("one one was a racehorse two two was one too".split()) 
>>> a 
Counter({'one': 3, 'two': 2, 'was': 2, 'a': 1, 'racehorse': 1, 'too': 1}) 
>>> a['one'] 
3 
+0

Это сработало для подсчета вопросов - спасибо! Есть ли у вас какие-либо предложения по поводу того, как я должен заниматься остальными? – Saltharion

0

Если то, что вы хотите это dictionary подсчет слов в строке, вы можете попробовать это:

string = 'hello world hello again now hi there hi world'.split() 
d = {} 
for word in string: 
    d[word] = d.get(word, 0) +1 
print d 

Выход:

{'again': 1, 'there': 1, 'hi': 2, 'world': 2, 'now': 1, 'hello': 2} 
0

Как говорится в luoluo, используйте коллекции.Counter.

Чтобы получить товар (ов) с самым высоким бирке, используйте метод Counter.most_common с аргументом 1, который возвращает список пар (word, tally), чьи вторые координаты все равно макс число. Если «предложение» не пусто, то этот список тоже. Таким образом, следующая функция возвращает некоторое слово, которое происходит, по крайней мере n раз, если есть один, и возвращает None иначе:

from collections import Counter 

def repeat_word_count(text, n): 
    if not text: return None  # guard against '' and None! 
    counter = Counter(text.split()) 
    max_pair = counter.most_common(1)[0] 
    return max_pair[0] if max_pair[1] > n else None 
0

почему бы вам не использовать счетчик класса для этого случая:

from collections import Counter 
cnt = Counter(text.split()) 

Где элементы хранятся в виде словарных ключей, а их значения хранятся в виде значений словаря. Тогда легко держать слова, что превышает ваши п число с iterkeys() в цикле, как

list=[] 
for k in cnt.iterkeys(): 
    if cnt[k]>n: 
     list.append(k) 

В списке вы получили свой список слов.

** Отредактировано: извините, thats, если вам нужно много слов, BrianO имеет право на ваш случай.

+0

И я думаю, что ваш лучший способ получить все слова, частота которых превышает n. Но вы можете просто сказать 'for k in cnt', не нужно' .iterkeys() '. – BrianO

+0

Спасибо, и могли бы быть в понимании списка, а затем просто вернуть '[k для k в cnt, если cnt [k]> n]', хотя это немного менее понятно. – Rulolp

+0

Да, вот что я буду делать. Я думаю, что это немного * более ясно, на самом деле :), но это я. – BrianO

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