代码之家  ›  专栏  ›  技术社区  ›  DwightD

Python 3中的用户输入和排序列表

  •  1
  • DwightD  · 技术社区  · 6 年前

    我需要帮助生成如下输出:

    1. Enter a member: samantha 
    Names: ['Samantha']
    2. Enter a member: susan 
    Names: ['Samantha', 'Susan']
    3. Enter a member: billy 
    Names: ['Billy', 'Samantha', 'Susan']
    4. Enter a member: billy
    4. Enter a member: samantha
    4. Enter a member: Jason 
    Names: ['Billy', 'Jason', 'Samantha', 'Susan']
    5. Enter a member: 
    
    Members:
    1. Billy
    2. Jason
    3. Samantha
    4. Susan
    

    我已经努力创建了一个这样做的程序,但没有效果。我将在代码本身的问题中进行评论。提前感谢您的帮助。

    def function():
    
        x = []
        #a = "1." # I tried to number the questions by adding these but it doesnt work
        while True:
            #a += 1
            name = input("Enter name: ").title()
            x.append(name)
    
            print("Names:", x)
            #if name == name: # this condition is made so that an input that is typed in again doesn't get included in the list
                #name = input("Enter name: ").title()
    
                # where should I add an insert() here to have the list alphabetically ordered?
    
            if not name: # pressing enter prints out the second half of the output, listing the members
                #print("\nMembers:", x).sort()
                break
    
    function()
    
    7 回复  |  直到 6 年前
        1
  •  2
  •   cryptopath    6 年前

    你几乎做了所有正确的事情,但问题是你在哪里打破了循环。您首先要附加名称,然后检查输入是否只是enter。所以,首先检查输入,然后将其附加到列表中。 这是我的代码:

    def fun1():
        l = []
        while True:
            s = input("Enter a member: ")
            if not s:
                break
            l.append(s.title())
            print("Names:", l)
        l.sort()
        print("Members:")
        for i in range(0, len(l)):
            print(i+1,end = '')
            print(".", l[i])
    fun1()
    

    希望有帮助。

        2
  •  1
  •   jpp    6 年前

    这是实现逻辑的一种方法。

    def function():
    
        x = []
    
        while True:
    
            name = input('{0}. Enter a member: '.format(len(x)+1)).title()
    
            if not name in x:
                x.append(name)
                x.sort()
                print('Names:', x)
    
            if len(x) == 4:
                break
    
        print('Members:')
        print('\n'.join(['{0}. {1}'.format(i, j) for i, j in enumerate(x)]))
    

    解释

    • 仅使用 list.append ,则, list.sort 并打印姓名 name 不在中 x
    • 您似乎希望最多有4个名称。那样的话 break 什么时候 len(x) 达到4。
    • 您可以将列表理解用于 str.format 用于最终输出。
        3
  •  1
  •   Mr. T Andres Pinzon    6 年前

    您不需要对代码进行太多更改。主要的重组包括将所有异常(如名称重复和无输入)移动到循环的顶部。评论中包含了更多的解释。

    def function():
        x = []
        #no need to keep track of the number of members, the list length will give us this information
        #infinite loop that will be interrupted, when no input is given 
        while True:
            #determine length of list, +1 because Python index starts with 0
            n = len(x) + 1
            #ask for input, format prints the number into the bracket position
            name = input("{}. Enter a member: ".format(n))
            #check if name already in list
            if name in x:
                #if name in list, ignore the input and start while loop again
                continue
            #no input - print out members and stop
            if not name: 
                print("Members:")
                #get for each member the index number i
                for i, member in enumerate(x):
                    #print index in position {0} and member name in position {1}
                    print("{0}. {1}".format(i + 1, member))
                #leave function()
                return
            #append name and sort list
            x.append(name)
            x.sort()        
            #print list
            print("Names:", x)
    
    
    function()
    
        4
  •  1
  •   yoniLavi qwwqwwq    6 年前

    我个人更喜欢使用 set 为了以更干净的方式避免重复,我还将两个打印部分合并到一个单独的函数中。因此,我的建议如下,其行为与您的略有不同,但(在我看来)更简单:

    def print_members(members):
        numbered_members = enumerate(sorted(members), 1)
        print("Members:", ", ".join(
            "{}. {}".format(*tup) for tup in numbered_members))
    
    
    def collect_members():
        members = set()
        while True:
            next_member_num = len(members) + 1
            name = input("{}. Enter a member: ".format(next_member_num)).title()
            if name:
                members.add(name)
                print_members(members)
            else:
                print_members(members)
                return
    

    请注意,排序(此处仅用于 print_members 如果成员数量增长过多,函数)将变得非常昂贵,在这种情况下,我建议使用二叉搜索树而不是集合。

        5
  •  1
  •   bfris    6 年前

    我保留了你的大部分结构,但修复了不少东西。为了获得编号,我使用了%字符串格式运算符。也可以使用str.format, which many seem to prefer

    您可以使用以下方法对列表进行就地排序(列表将替换为已排序的列表) x.sort() .要检查列表中是否有内容,请使用 thing is in mylist thing is not in mylist

    def function():
    
        x = []
        a = 1
        while True:
            prompt = '%d. Enter a member: ' % a
            name = input(prompt)
            name = name.title() # convert first letter to uppercase
    
            if name.strip() == '':  # enter or empty string entered
                print()
                print('Members:')
                for idx, item in enumerate(x):
                    print('%d. %s' % (idx+1, item))
                break
            elif name not in x:
                x.append(name)
                x.sort()  # sort x in place
                print("Names: ", x)
                a += 1
    
    
    function()
    

    和我的输出:

    1. Enter a member: samantha
    Names:  ['Samantha']
    2. Enter a member: susan
    Names:  ['Samantha', 'Susan']
    3. Enter a member: billy
    Names:  ['Billy', 'Samantha', 'Susan']
    4. Enter a member: Jason
    Names:  ['Billy', 'Jason', 'Samantha', 'Susan']
    5. Enter a member:
    
    Members:
    1. Billy
    2. Jason
    3. Samantha
    4. Susan
    
    
    ------------------
    (program exited with code: 0)
    
    Press any key to continue . . .
    
        6
  •  1
  •   tinutomson    6 年前

    这个 getPositionByBinarySearch 未实现,因此您可以自己实现它。

    def getPositionByBinarySearch(arr, name):
        """
        implement binary search to find the index at which insertion should happen)
        return -1 if insertion is not needed (exact match is found)
        """
    
    def func():
        arr = []
        while True:
            name = input(str(len(x)+1) + '. Enter a number: ')
            if not name:
                print "Members:"
                for i, member in enumerate(members):
                    print(str(i+1) + '. ' + member)
                break;
            pos = getPositionByBinarySearch(arr, name)
            if (pos != -1):
                arr = arr[:i] + [name] + arr[i:]
    
        7
  •  0
  •   Moon    5 年前
    def fun1():
        l = []
        while True:
            s = input("Enter a name or '-1' to quit: ")
            if s=='-1':
                break
            l.append(s)
        l.sort()
        print("The sorted names or numbers(whatever) are:")
        print(l)
    fun1()