排序问题,无法排序最后的结果
来源:13-10 sorted 排序

慕瓜1512093
2017-12-09
先谢谢老师上次解答,最后一条条排查发现最后go函数调用的时候因为没加精炼函数有两条函数位置写反了导致list不匹配。。。
然后基本改写成视频里面的样子
可是最后依然不能排序
(正则表达式我自己另外编了个,在别的代码里调试过可以正确匹配,且加断点单步调试也看出number的值是正确的)
比如原本得到的列表anchors是[ 1000,1万,9000千]
经过sorted排序后依然还是一个样子(并没有排序过)
已经研究了俩晚上,希望老师解答一下(代码在最后)
其次,
我不太清楚
__sort_seed()最后return返回的一个值仅仅是一个数字值还是一个变量(number = int(value))?
sorted()函数中,key调用了__sort_seed()函数进行排列,我真的是想破脑袋都想不明白啊
比如,这个
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=lambda s: s[2])
把列表students中每个元素的第三个值来排列
可是在老师的代码中根据一个函数来进行排列
这个函数最后返回的是一个由str改为float的值
我实在理解不了的是,anchors中的['number']关键词的值,经过__sort_seed()已经被改成float了吗?
如果已经改了,那为什么最后打印出来的不是数字而是str(有'人',有'万')
如果没有改,那么又怎么做到通过数字大小来排序的呢
==========代码如下================================
考虑到复制的没缩进,另外创建了百度外链↓
https://pan.baidu.com/s/1eRQNmwU
import re
from urllib import request
class Spider():
url = 'https://www.douyu.com/directory/game/LOL'
print(url)
root_pattern ='<div class="mes">([\s\S]*?)</a>'
root_pattern_name = '<span class="dy-name ellipsis fl">([\s\S]*?)</span>'
root_pattern_members = '<span class="dy-num fr" >([\s\S]*?)</span>'
def __fetch_content(self):
r = request.urlopen(Spider.url)
htmls = r.read()
htmls = str(htmls,encoding='utf-8')
return htmls
def __analysis(self,htmls):
root_html = re.findall(Spider.root_pattern, htmls)
anchors = []
for html in root_html:
name = re.findall(Spider.root_pattern_name,html)
number = re.findall(Spider.root_pattern_members,html)
anchor = {'name':name,'number':number}
anchors.append(anchor)
return anchors
def __sort(self,anchors):
anchors = sorted(anchors,key=self.__sort_seed,reverse=True)
return anchors
def __sort_seed(self,anchor):
r = re.findall('\d*\.{0,1}\d*',anchor['number'])
number = float(r[0])
if '万' in anchor['number']:
number *= 10000
return number
def __refine(self,anchors):
l = lambda anchor: {
'name':anchor['name'][0].strip(),
'number':anchor['number'][0]
}
return map(l, anchors)
def __show(self,anchors):
for anchor in anchors:
print(anchor['name']+'---------'+anchor['number'])
def go(self):
htmls = self.__fetch_content()
anchors = self.__analysis(htmls)
anchors = list(self.__refine(anchors))
ahchors = (self.__sort(anchors))
self.__show(anchors)
spider = Spider()
spider.go()
1回答
-
这个这么理解。sorted的函数是让你自己返回一个值,这个值不一定是int还是float还是str,但是你返回的这些值的类型一定要是可以比较大小的。sorted函数就是根据这个 值的大小来决定排序的顺序。
012017-12-13
相似问题