鱼C论坛

 找回密码
 立即注册
查看: 1040|回复: 5

[技术交流] sort函数相关问题

[复制链接]
发表于 2018-4-25 00:07:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
QQ截图20180425000101.png QQ截图20180425000121.png
想给这个列表里面的字符串按照数字排序。可是为什么100永远在前面!?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-25 08:41:05 | 显示全部楼层
split()括号中间好像要有个空格,另外最好转成int类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-4-25 09:41:32 | 显示全部楼层
楼上的后半句应该是对的,如果改成 int(score.split()[1])   就可以按照楼主的意思实现了,但是split()默认是以空格分割的,所以楼上的上半句是错的。  
归结到底其实是sorted语句对字符串数组的排序问题,楼主不妨看一看下面两个例子:
list1 =['100','23','45','11','99']
sorted(list1)


list1 =[100,23,45,11,99]
sorted(list1)

两个结果不一样哦,split分割出来的是字符串,是第一种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-4-25 09:59:51 | 显示全部楼层
本帖最后由 ABC23 于 2018-4-25 10:03 编辑

split()方法默认separator为空格,可以不显式指出。
==============================
  0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel
       8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si
      16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb
      24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us
      32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '
      40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /
      48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7
      56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?
      64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G
      72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O
      80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W
      88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _
      96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g
     104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o
     112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w
     120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del

这是一张系统生成的ASCII编码表,通过man ascii查看
=================================================
'100' => 49 48 48
'60' => 54 48
'30' => 51 48
'99' => 57 57

sort()、sorted()函数对字符串排序,实际比较的是他们的ASCII值,先看位数,位数相同比较每位的值。小的在前面。
因为100转换为ASCII最高位是49,最小,所以在最前面。
==================================
要比较的是int类型,应该显性进行转换:

&#10140;  desktop cat pp.py
#!/usr/bin/env python3

lyst = []
with open('demo.txt') as f:
    line = f.readline()
    while line:
         lyst.append(line.strip())
         line = f.readline()
print(lyst)
lyst.sort(key=lambda x: int(x.split()[1]))

print(lyst)

这样就好了。
['杨颖 100', '样大海 60', '王二狗 30', '李铁蛋 99']
['王二狗 30', '样大海 60', '李铁蛋 99', '杨颖 100']
=================================
测试文件:
&#10140;  desktop cat demo.txt
杨颖 100
样大海 60
王二狗 30
李铁蛋 99
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 10:44:17 | 显示全部楼层
王二狗、孙二狗、徐二狗、杨二狗、马二狗……哈哈哈哈哈哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 12:00:24 | 显示全部楼层
哇谢谢各位!!!太激动了这么想详细的解释!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 10:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表