【问题标题】:I have wrong results with sorting function at python我在 python 的排序功能上有错误的结果
【发布时间】:2016-04-18 12:05:58
【问题描述】:

目前我正在学习Python,希望有人能帮助我。我尝试使用 sort() 对特定列表进行升序排序,但是当我尝试这个示例时,它的输出是错误的。

Number_list[9,5,13]
Number_list.sort()
print Number_list

我得到的结果是:['13', '5', '9']

它应该是:['5', '9', '13']

我正在尝试编写显示最大奇数的程序,我编写代码如下:

Number_list = []
print "Enter first number:"
Number_list.append (raw_input());
print "Enter second number:"
Number_list.append (raw_input());
print "Enter third number:"
Number_list.append (raw_input());
Number_list.sort()
if int(Number_list[2]) % 2 != 0 :
     print Number_list[2]
elif int(Number_list[1]) %2 != 0:
     print Number_list[1]
elif int(Number_list[0]) % 2 != 0:
     print Number_list[0]
else:
    print "There is no Odd number"

【问题讨论】:

  • 您是否要在第一行将Number_list 分配给列表[9,5,13]?你忘了=吗?

标签: python-2.7


【解决方案1】:

看起来您的列表是字符串列表而不是数字列表。你的列表是这样定义的吗?

NumberList = ['9', '5', '13']

更新:

从您更新的代码 sn-p 我们看到您如何填写您的列表:

Number_list.append(raw_input())

您必须知道,在 Python 2 中,raw_input 将用户输入作为字符串返回,并且不会将其解析为数字类型。

这意味着你得到了一个字符串列表,正如我所说的。我们还可以看到您希望继续对数字而不是字符串进行操作,因此在将输入附加到列表之前将输入转换为整数是最简单的:

Number_list.append(int(raw_input()))

这样我们会得到一个数字列表,并且代码后半部分中的排序和计算都将按预期工作。


如果我们对该列表进行排序,它将根据字符的 ASCII 码按字母顺序对里面的字符串内容进行排序。当然,“1”的代码比“5”或“9”低,因此“13”是结果的第一个元素。

您显然希望对列表进行数字排序,因此您需要直接用可能预期的数字填充列表,或者如果有特殊原因必须用字符串填充列表,则需要指定一个键将元素转换为数字的函数。

  • 选项 1(数字列表):

    Number_list = [9, 5, 13]
    Number_list.sort()
    print Number_list
    # output: [5, 9, 13]
    
  • 选项 2(字符串列表,但带有排序键):

    Number_list = ['9', '5', '13']
    Number_list.sort(key=int)
    print Number_list
    # output: ['5', '9', '13']
    

【讨论】:

  • 我正在尝试编写一个程序来检查三个变量——x、y 和 z,并打印其中最大的奇数。如果它们都不奇怪,我应该为此打印一条消息。我的代码如下:
  • Number_list = [] print "输入第一个数字:" Number_list.append (raw_input()); print "输入第二个数字:" Number_list.append (raw_input()); print "输入第三个数字:" Number_list.append (raw_input()); Number_list.sort() print Number_list if int(Number_list[2]) % 2 != 0 : print Number_list[2] elif int(Number_list[1]) %2 != 0: print Number_list[1] elif int(Number_list[ 0]) % 2 != 0: print Number_list[0] else: print "There is no Odd number"
  • @Alaa 请不要在评论中转储您的代码,这会破坏格式并使其无用。请改为编辑您的问题并将其粘贴到那里。然后再次删除此评论。谢谢!
  • @Alaa 正如我所假设的,您使用字符串字段列表(Python 2 的 raw_input 将输入作为字符串返回!)。请参阅我的编辑以了解您必须如何填写您的列表,而不是获得一个按照您期望的方式运行的数字列表。如果它对您有所帮助,请不要忘记通过单击其左侧的灰色勾号符号来接受此答案。谢谢。
  • 这真的很有帮助,非常感谢。我已经接受了这个答案
【解决方案2】:

首先,Number_list[9,5,13] 中有一个 SyntaxErrorTypeError。你的意思可能是Number_list = [9,5,13]

raw_input() 返回一个字符串;不是一个数字。 "13" 是一个字符串,13 没有引号是一个整数。字符串与整数不同,并且不支持相同的方法(主要是数学)。但是,正如 Byte Commander 还指出的那样,所有字符也都有 ASCII 表示;例如“A”是65,1("1")的字符串表示是49,等等,可以使用ord()方法查看这些代码;例如ord("A").

当您对字符串列表进行排序时,我相信 Python 会查看每个字符串的第一个字符,将其转换为其 ASCII 整数代码并相应地对其进行排序。 看看下面的字符串列表会发生什么:

>>> n = ["1000", "2", "3"]
>>> n.sort()
>>> n
['1000', '2', '3']
>>>

我们刚刚对一个列表进行了排序,但 1000 仍然小于 2 和 3!?这显然不适用于整数,但因为我们的列表包含字符串,当我们调用 sort() 时,Python 会这样做:

>>> n = ["1000", "2", "3"]

# get the ASCII code of the first character of every string
>>> n_ascii_codes = [ord(x[0]) for x in n]

# "1" -> 49 (ignoring 000 in 1000), 2 -> 50, 3 -> 51
>>> n_ascii_codes
[49, 50, 51]
>>>  

要修复您的代码,请在调用 sort() 之前将列表中的所有字符串转换为整数。例如。通过使用列表理解。这样就不用每次使用raw_input()时都写int()了:

...
print "Enter third number:"
Number_list.append (raw_input());

# add this if you want to convert all the strings to integers 
Number_list = [int(x) for x in Number_list]

Number_list.sort()
...

【讨论】:

  • 抱歉,缺少“=”并不能解释观察到的排序顺序 - 它会导致异常 TypeError: list indices must be integers, not tuple!
  • Number_list = [] print "输入第一个数字:" Number_list.append (raw_input()); print "输入第二个数字:" Number_list.append (raw_input()); print "输入第三个数字:" Number_list.append (raw_input()); Number_list.sort() print Number_list if int(Number_list[2]) % 2 != 0 : print Number_list[2] elif int(Number_list[1]) %2 != 0: print Number_list[1] elif int(Number_list[ 0]) % 2 != 0: print Number_list[0] else: print "There is no Odd number"
  • @ByteCommander 对不起,我读得太快了,只是假设 OP 在没有告诉我们的情况下得到了TypeError。相反,似乎 OP 没有发布他/她实际运行的代码(我们看到整数列表,但 OP 必须使用字符串列表)
  • @Alaa 您能否将您在评论中发布的代码添加到问题中?这样阅读起来要容易得多。
  • 第一段的一些ASCII码是错误的。 “A”是 65。除此之外,它看起来还不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多