2017-01-16 71 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感谢您的答案。发现重复3

+3

你马上'return' ... –

+2

您正在寻找'collections.Counter' – Akavall

+2

因为当你*返回*函数停止执行时...另外,为什么你将调用的结果返回给'print'?这将始终返回“无”。 –

回答

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) 

最后是更好地使函数计算函数做我之间的分离/ 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] 

很可能更有效率(它不”牛逼一遍又一遍地讲述每个字符),只报告每个字符一次,并使用参数和返回值,而不是inputprint,所以它更灵活(您main方法可以提示inputprint OU如果它选择)。

用法很简单(和感谢OrderedCounter,它保留在原来的字符串第一次出现的秩序太):

>>> find_duplicate('aaacfdedbfrf') 
[('a', 3), ('f', 3), ('d', 2)]