0

我需要关于我必须编写的函数的帮助,其中包括一个 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
4

4 回答 4

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
于 2013-03-12T12:13:47.730 回答
1
    for n in lst:
        if n in count:
            count[n]+=1

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

于 2013-03-11T22:45:53.180 回答
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)

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

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    
于 2013-03-12T13:22:56.303 回答
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))
于 2013-03-12T12:19:15.020 回答