2013-03-11 144 views
0

我需要一个功能我必须写,其中包括一个while循环将继续下去,直到用户输入一个空的输入,一旦出现这种情况,该函数将返回一个名称已进入在while循环中计数输入?

的次数帮助到目前为止,我的代码是:

while True: 
    name = input('Enter a name:') 

    lst = name.split() 
    count={} 
    for n in lst: 
     if n in count: 
      count[n]+=1 

    for n in count: 
     if count[n] == 1: 
      print('There is {} student named {}'.format(count[n],\ 
                n)) 
     else: 

      print('There are {} students named {}'.format(count[n],\ 
                 n)) 

此不赘述,只要求用户而返回1

输出应该是这样的:

Enter next name:Bob 
Enter next name:Mike 
Enter next name:Bob 
Enter next name:Sam 
Enter next name:Mike 
Enter next name:Bob 
Enter next name: 

There is 1 student named Sam 
There are 2 students named Mike 
There are 3 students named Bob 

回答

1
for n in lst: 
     if n in count: 
      count[n]+=1 

在上述代码中,n永远不会添加到您的count字典中。即count仍然在循环后空..

+0

实际上,它会在第一个'+ = 1'和'KeyError'失败。这是因为'n'没有任何价值。 – pepr 2013-03-12 12:45:13

+1

@pepr no。 'count [n] + = 1'不会被执行,因为'n in count'是'False' – zzk 2013-03-12 18:14:30

+0

+1。你是对的 – pepr 2013-03-13 07:40:59

1

什么@zzk是说每个人的使用建议是

for n in lst: 
    if n in count: 
     count[n]+=1 
    else: 
     count[n]=1 

对于大部分功能答案

count= {} 

while True: 

    name = raw_input('Enter a name:') 
    lst = name.split() 

    for n in lst: 
     count[n] = count.get(n, 0) + 1 

    if not lst: 
     for n in count: 
      if count[n] == 1: 
       print('There is {} student named {}'.format(count[n],n)) 
      else: 
       print('There are {} students named {}'.format(count[n],n)) 
     break 
+0

'if'下面的四行可以用'count [n] = count.get(n,0)+ 1'来代替。 '.get()'与'[]'类似,但它可以采用默认值。 – pepr 2013-03-12 12:47:25

1

除了事实,你绝不添加n到您的count字典,您可以在while循环的每次迭代中一次又一次地初始化此字典。你必须把它放在循环之外。

count= {} 

while True: 
    name = input('Enter a name:') 

    lst = name.split() 
    for n in lst: 
     if n in count: 
      count[n] += 1 
     else: 
      count[n] = 1 

    for n in count: 
     if count[n] == 1: 
      print('There is {} student named {}'.format(count[n],\ 
                n)) 
     else: 

      print('There are {} students named {}'.format(count[n],\ 
                 n)) 
1

以下是有点矫枉过正。这只是要知道有标准模块collections,它包含Counter类。无论如何,我更喜欢问题中使用的简单解决方案(在删除错误之后)。第一个函数读取输入并在输入空名称时中断。第二个函数显示结果:

#!python3 

import collections 


def enterStudents(names=None): 

    # Initialize the collection of counted names if it was not passed 
    # as the argument. 
    if names is None: 
     names = collections.Counter() 

    # Ask for names until the empty input. 
    while True: 
     name = input('Enter a name: ') 

     # Users are beasts. They may enter whitespaces. 
     # Strip it first and if the result is empty string, break the loop. 
     name = name.strip() 
     if len(name) == 0: 
      break 

     # The alternative is to split the given string to the first 
     # name and the other names. In the case, the strip is done 
     # automatically. The end-of-the-loop test can be based 
     # on testing the list. 
     # 
     # lst = name.split() 
     # if not lst: 
     #  break 
     # 
     # name = lst[0] 
     #     (my thanks to johnthexiii ;) 


     # New name entered -- update the collection. The update 
     # uses the argument as iterable and adds the elements. Because 
     # of this the name must be wrapped in a list (or some other 
     # iterable container). Otherwise, the letters of the name would 
     # be added to the collection. 
     # 
     # The collections.Counter() can be considered a bit overkill. 
     # Anyway, it may be handy in more complex cases.  
     names.update([name])  

    # Return the collection of counted names.  
    return names 


def printStudents(names): 
    print(names) # just for debugging 

    # Use .most_common() without the integer argument to iterate over 
    # all elements of the collection. 
    for name, cnt in names.most_common(): 
     if cnt == 1: 
      print('There is one student named', name) 
     else: 
      print('There are {} students named {}'.format(cnt, name)) 


# The body of a program. 
if __name__ == '__main__': 
    names = enterStudents() 
    printStudents(names) 

有部分代码可以删除。 enterStudents()中的name参数允许调用该函数为现有集合添加名称。初始化为None用于将空初始集合作为默认集合。

如果要收集包括空格在内的所有内容,则name.strip()不是必需的。

它打印出我的控制台上

c:\tmp\___python\user\so15350021>py a.py 
Enter a name: a 
Enter a name: b 
Enter a name: c 
Enter a name: a 
Enter a name: a 
Enter a name: a 
Enter a name: 
Counter({'a': 4, 'b': 1, 'c': 1}) 
There are 4 students named a 
There is one student named b 
There is one student named c  
+1

如果你打算去那些长度的话,应该考虑规范化输入(即用户.lower())。应该可能使用raw_input而不是输入。您不会将自己放入Counter的空白区域剥离出来,不确定Counter是否自行处理。 – John 2013-03-12 13:27:36

+1

@johnthexiii:我的+1。他或她使用Python 3 - 然后'input()'确定。剥离添加。注释中带有'.split()'的选项。感谢您的意见;) – pepr 2013-03-12 13:37:27

+0

我不知道'输入',谢谢。 – John 2013-03-12 13:46:17