2017-01-16 2 views
1
def find_duplicate(): 
    x =input("Enter a word = ") 
    for char in x : 
     counts=x.count(char) 
     while counts > 1: 
      return print(char,counts) 

У меня есть небольшая проблема там я хочу, чтобы найти все дубликаты в строке, но эта программа дает мне только один дубликат ех: aassdd моя функция ввода дала только мне: 2, но он должен быть в таком виде: 2 s: 2 d: 2 спасибо за ваши ответы.поиска дубликатов в строке на Python 3

+3

Вы сразу 'return' ... –

+2

Вы ищете' collections.Counter' – Akavall

+2

Потому что, когда вы * возвращаете *, функция прекращает выполнение ... Кроме того, почему вы возвращаете результат вызова 'print'?Это всегда будет возвращать 'None'. –

ответ

1

return - это ключевое слово, которое работает более или менее, так как сразу же выходит из этой функции (и, необязательно, переносит некоторый вывод с вами). Таким образом, вы должны удалить return заявление:

def find_duplicate(): 
    x =input("Enter a word = ") 
    for char in x : 
     counts=x.count(char) 
     print(char,counts) 

Кроме того, вы также должны удалить петлю while (или обновлять счетчик, если вы хотите print несколько раз), в противном случае вы застрять в бесконечном цикле, так как count не обновляется, и тест, таким образом, всегда будет успешным.

Обратите внимание, что в этом случае a будет напечатан несколько раз (в данном случае два), если он найден несколько раз в строке. Вы можете решить эту проблему путем первого построения set из символов в строке и перебирать этот набор:

def find_duplicate(): 
    x =input("Enter a word = ") 
    for char in set(x): 
     counts=x.count(char) 
     print(char,counts) 

Наконец, лучше сделать разделение между функций, которые вычисляют и функции, которые делают I/O (например, print). Поэтому вам лучше сделать функцию, которая возвращает словарь со счетчиками, и тот, который печатает этот словарь. Вы можете создать словарь, как:

def find_duplicate(x): 
    result = {} 
    for char in set(x): 
     result[char]=x.count(char) 
    return result 

и функцию вызова:

def do_find_duplicates(x): 
    x =input("Enter a word = ") 
    for key,val in find_duplicate(x).items(): 
     print(key,val) 

И теперь лучшая часть: вы на самом деле не нужно, чтобы написать функцию find_duplicate: есть утилита класса для что: Counter:

from collections import Counter 

def do_find_duplicates(x): 
    x =input("Enter a word = ") 
    for key,val in Counter(x).items(): 
     print(key,val) 
+0

Конечно, этот цикл 'while' никогда не будет завершен в случае, когда' counts'> 1. –

+0

@ juanpa.arrivillaga: хорошая точка. Не учли это. Перепишу ответ. –

0

Это поможет вам.

def find_duplicate(): 
    x = input("Enter a word = ") 
    for char in set(x): 
     counts = x.count(char) 
     while counts > 1: 
      print(char, ":", counts, end=' ') 
      break 
find_duplicate() 
0
def find_duplicate(): 

    x =input("Enter a word = ") 

    dup_letters = [] 

    dup_num = [] 

    for char in x: 

     if char not in dup_letters and x.count(char) > 1: 

      dup_letters.append(char) 

      dup_num.append(x.count(char)) 

    return zip(dup_letters, dup_num) 

dup = find_duplicate() 

for i in dup: 

    print(i) 
0

Просто потому, что это весело, это решение, которое использует встроенные модули, чтобы избежать написания более пользовательского кода, чем это абсолютно необходимо:

from collections import Counter, OrderedDict 

# To let you count characters while preserving order of first appearance 
class OrderedCounter(Counter, OrderedDict): pass 

def find_duplicate(word): 
    return [(ch, cnt) for ch, cnt in OrderedCounter(word).items() if cnt > 1] 

Вполне вероятно, более эффективным (Безразлично» t пересчитывать каждый символ снова и снова), только один раз обрабатывает каждый символ и использует аргументы и возвращает значения вместо input и print, поэтому он более универсален (ваш метод main может запрашивать input и print ou tput, если он выбирает).

Использование простой (и благодаря OrderedCounter, он сохраняет порядок первого появления в исходной строке тоже):

>>> find_duplicate('aaacfdedbfrf') 
[('a', 3), ('f', 3), ('d', 2)] 
Смежные вопросы