【问题标题】:How to add the Numbers from the User into a List如何将用户的数字添加到列表中
【发布时间】:2016-01-22 10:01:32
【问题描述】:

我一直在尝试编写一个平均值、中位数和众数计算器。我有两个问题。 1)我如何将用户输入的数字添加到空列表中。如果我只是简单地输入数字,它会给我这个错误:

userNumbers = int(raw_input("Enter the digits here: "))
ValueError: invalid literal for int() with base 10: '2, 4, 6, 8'

我很想知道如何避免这种情况。 其次,我使用的是 Python 2.7.10,并且很快就会迁移到 3.4。我知道在 3.4 上有一个名为 statistics 的模块,它有一个中值函数,但是它在 2.7.10 上不起作用。出于好奇,我将如何找到没有该功能的中位数。谢谢大家!

from collections import Counter


def numberPlacement():
    print("Welcome to the PyCalculator, please enter a series of digits!")
    userNumbers = int(raw_input("Enter the digits here: "))
    userNumbers = []


def userChoice():
    while True:
        print("Awesome, now that we haave your numbers please choose an operation (Mean, Median, or Mode!)")
        userAnswer = raw_input("Enter your choice here: ")
        if userAnswer == "Mean":
            mean = sum(userNumbers) / float(len(userNumbers))
            return mean
        elif userAnswer == "Mode":
            mode = Counter(userNumbers)
            return mode
        continue

print numberPlacement()
print userChoice()

【问题讨论】:

    标签: python list median


    【解决方案1】:

    您收到的错误是因为您试图将无效字符转换为 int。

    您的输入是:1, 2, 3, 4,所以这些逗号是导致该错误的原因。

    要纠正这个问题,只需删除您拥有的 int() 演员表,通过在您的输入中附加 .split(',') 使您的输入成为一个列表。该拆分的作用是通过在逗号上拆分将您的字符串转换为列表。这样,您将拥有一个由字符串表示的数字列表。

    因此,由于您在做数学运算,因此您需要确保您实际使用的是数字表示,而不是列表中数据的字符串表示。您可以通过使用 Python 的 map 方法 (documentation) 来完成一个简洁的单行解决方案,它将所有条目转换为 int。

    因此,您的用户输入可以简单地如下所示:

    Python 3:

    userNumbers = list(map(int, input("Enter the digits here: ").split(',')))
    

    Python 2:

    userNumbers = map(int, raw_input("Enter the digits here: ").split(','))
    

    您的代码中还有另一个问题。在您的 userChoice 方法中,您引用了 userNumbers。我认为这是在numberPlacement 方法中对userNumbers 的引用。你不能这样做。

    我建议做的是,因为您似乎想分别调用这两个方法,所以让您的 userChoice 方法接受一个参数,该参数将是一个名为 userNumber 的列表。很简单:

    def userChoice(userNumbers):
        # the rest of your code
    

    现在,非常重要的是要记住,userChoice 方法中的 userNumbersnumberPlacement 方法中的 userNumbers 不同。要了解原因,这是范围界定的一部分。您可以阅读here

    所以,当你现在调用你的方法时,你只需要做这样的事情:

    number_placements = numberPlacement()
    print(number_placements)
    print(userChoice(number_placements))
    

    当你把它们放在一起时,你的代码现在看起来像这样:

    (Python 2)

    from collections import Counter
    
    
    def numberPlacement():
        print("Welcome to the PyCalculator, please enter a series of digits!")
        userNumbers = map(int, raw_input("Enter the digits here: ").split(','))
        return userNumbers
    
    
    def userChoice(userNumbers):
        while True:
            print("Awesome, now that we haave your numbers please choose an operation (Mean, Median, or Mode!)")
            userAnswer = raw_input("Enter your choice here: ")
            if userAnswer == "Mean":
                mean = sum(userNumbers) / float(len(userNumbers))
                return mean
            elif userAnswer == "Mode":
                mode = Counter(userNumbers)
                return mode
            continue
    
    
    r = numberPlacement()
    print(userChoice(r))
    

    演示:

    Welcome to the PyCalculator, please enter a series of digits!
    Enter the digits here: 1,2,3,4
    Awesome, now that we haave your numbers please choose an operation (Mean, Median, or Mode!)
    Enter your choice here: Mode
    Counter({1: 1, 2: 1, 3: 1, 4: 1})
    

    【讨论】:

    • @Jack 不客气。让我知道它是否适合你。
    • 可悲的是,我测试了代码,它给了我同样的错误。
    • @Jack 它对我有用。我拿走了你的代码,只是替换了我在答案中输入的那一行。看这里:pastebin.com/VGb9zhwD
    • 请问您运行的是什么版本,因为我运行的是 2.7.10,它给了我这个错误:AttributeError: 'tuple' object has no attribute 'split' 非常感谢!
    • 很高兴你提出来了。我知道为什么。更新中。
    【解决方案2】:

    您需要拆分输入:

    a = raw_input("Enter the digits here: ").split(',')
    b = [int(x) for x in a]
    

    然后你可以参考你的号码。

    【讨论】:

      【解决方案3】:

      您正在打印不需要打印的随机内容,并且您还尝试在全局范围内调用局部范围的变量

      def numberPlacement():
          print("Welcome to the PyCalculator, please enter a series of digits, comma seperated!")
          userNumbers = raw_input("Enter the digits here: ")
          return [ int(u.strip()) for u in userNumbers.split(',') ]
      
      
      def userChoice(userNumbers):
          print("Awesome, now that we haave your numbers please choose an operation (Mean, Median, or Mode!)")
          userAnswer = raw_input("Enter your choice here: ")
      
          if userAnswer == "Mean":
      
              mean = sum(userNumbers) / float(len(userNumbers))
              return mean
      
          #omitted
      
      userNumbers = numberPlacement()
      print(userChoice(userNumbers))
      
      
      
      #list comprehension rewritten as a basic for loop in response to question in comment
      
      final_list = []
      for u in userNumbers.split(','):
          x = u.strip()
          y = int(x)
          final_list.append(y)
      
      return final_list
      

      【讨论】:

      • 还有一个问题,在第 4 行,你能解释一下你做了什么吗?我现在只编码了大约一个星期,所以我还是新手!谢谢!
      • 这就是所谓的列表理解,在所有细节方面,谷歌的老师比我好得多。根据您构建它们的方式,它们可以用于许多不同的事情。在这个例子中,它基本上是一个 for 循环。尝试将其阅读为“用逗号分割字符串 usernumbers,并为结果列表中的每个元素去除前导/尾随空格,将其转换为整数。返回所有最终结果的列表。”如果你愿意,你可以把它写成一个 for 循环。
      • 添加了一个如何将其作为 for 循环执行的示例,以便您更容易理解。
      • 啊,这更有意义,谢谢。我只需要多读一点。我希望这个编码事情变得更容易一些。谢谢!
      • 此外,统计模块可用于 python 2.x,它只是不是基本安装的一部分。在您的 venv 中,或作为 root/管理员,使用 pip 安装统计信息
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多