【问题标题】:User inputs and sorted lists in Python 3Python 3 中的用户输入和排序列表
【发布时间】:2018-05-11 23:49:06
【问题描述】:

我需要帮助生成这样的输出:

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()

【问题讨论】:

    标签: python python-3.x list sorting input


    【解决方案1】:

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

    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()
    

    希望对你有帮助。

    【讨论】:

    • 这是我在我这个级别上最了解的,谢谢!我怎样才能在它仍然要求用户输入的同时让字符串按顺序排列?
    • 只需将“l.sort()”放在“l.append(s.title())”之后
    【解决方案2】:

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

    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)]))
    

    说明

    • 仅在name 不在x 中时使用list.appendlist.sort 和打印名称。
    • 看来您最多需要 4 个名称。在这种情况下,当len(x) 达到 4 时,break
    • 您可以使用带有str.format 的列表推导式作为最终输出。

    【讨论】:

      【解决方案3】:

      您不需要对代码进行很多更改。主要重组涉及将所有异常(例如名称重复和无输入)移至循环顶部。更多解释集成在 cmets 中。

      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】:

        我个人更喜欢使用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】:

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

          您可以使用x.sort() 对列表进行就地排序(列表被排序列表替换)。要检查某些内容是否在列表中,请使用 thing is in mylistthing 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】:

            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】:
              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()
              

              【讨论】:

              • 大家好。因此,我进行了一些编辑并创建了一个接受无限数量名称的应用程序,然后使用排序按字母顺序显示它们。示例输出:输入姓名(-1 退出):Brennan 输入姓名(-1 退出):Edgar 输入姓名(-1 退出):Allan 输入姓名(-1 退出):-1 姓名为[艾伦、布伦南、埃德加]
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-05
              • 1970-01-01
              • 2019-03-17
              • 2015-10-17
              • 1970-01-01
              相关资源
              最近更新 更多