排序问题,无法排序最后的结果

来源: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回答

7七月

2017-12-12

这个这么理解。sorted的函数是让你自己返回一个值,这个值不一定是int还是float还是str,但是你返回的这些值的类型一定要是可以比较大小的。sorted函数就是根据这个 值的大小来决定排序的顺序。

0
1
慕瓜1512093
非常感谢!
2017-12-13
共1条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14640 学习 · 4477 问题

查看课程