python中url解析及排序函數sort ()與 sorted() 區別、字典排序及高級用法

python中url解析及排序函數sort ()與 sorted() 區別、字典排序及高級用法

一、python如何解析url,獲取host和path

最近在工作中需要將url的host和path路徑分開存儲,python內置的urlparse, 支持我們優雅的解決這個問題,參考地址

>>> from urlparse import urlparse

>>> url = 'https://docs.google.com/spreadsheet/ccc?key=blah-blah-blah-blah#gid=1'

>>> parsed_uri = urlparse(url)

>>> print parsed_uri

ParseResult(scheme='https', netloc='docs.google.com', path='/spreadsheet/ccc', params='', query='key=blah-blah-blah-blah', fragment='gid=1')

由上文我們可以看到,url被拆分的很細緻,提取的方法也很簡單,只需要給屬性取一個別名,後面跟上解析的key,即可匹配出解析文本。

>>> from urlparse import urlparse

>>> pp=u'http://java.aaaaaaa.cn/java/course/javaeeadvanced.shtml'

>>> parsed_uri = urlparse(pp)

>>> parsed_uri

ParseResult(scheme=u'http', netloc=u'java.aaaaaaa.cn', path=u'/java/course/javaeeadvanced.shtml', params='', query='', fragment='')

>>> parsed_uri.netloc

u'java.aaaaaaa.cn'

>>> print parsed_uri.scheme

http

>>> print parsed_uri.netloc

java.aaaaaaa.cn

>>> print parsed_uri.path

/java/course/javaeeadvanced.shtml

二、Python中sort ()與 sorted() 區別

對於一個指定的列表,如果想要對它進行排序,python內置了sort和sorted方法,那麼這兩者又有什麼區別呢?

描述

sort 與 sorted 區別:

  1. sort 是應用在 list 上的方法,屬於列表的成員方法,sorted 可以對所有可迭代的對象進行排序操作。
  2. list 的 sort 方法返回的是對已經存在的列表進行操作,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。
  3. sort使用方法爲ls.sort(),而sorted使用方法爲sorted(ls)
  4. sorted()適用於任何可迭代容器,list.sort()僅支持list(本身就是list的一個方法)

>>> p=(11,333,22,3,5,6,10)

>>> p.sort()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: 'tuple' object has no attribute 'sort'

>>> sorted(p)

[3, 5, 6, 10, 11, 22, 333]

>>> sorted(p,reverse=True)

[333, 22, 11, 10, 6, 5, 3]

語法

準確的說,sorted是個函數,sort是方法。

def sorted(iterable, cmp=None, key=None, reverse=False): # real signature unknown; restored from __doc__

""" sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list """

pass

 

>>> b = [1,4,5,6,7,123,4,5]

>>> print(sorted(b))

[1, 4, 4, 5, 5, 6, 7, 123]

>>> print(b)

[1, 4, 5, 6, 7, 123, 4, 5]

def sort(self, cmp=None, key=None, reverse=False): # real signature unknown; restored from __doc__

"""

L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;

cmp(x, y) -> -1, 0, 1

"""

pass

 

>>> a = [1,4,5,6,7,123,4,5]

>>> print(a)

[1, 4, 5, 6, 7, 123, 4, 5]

>>> a.sort()

>>> print(a)

[1, 4, 4, 5, 5, 6, 7, 123]

由此可知,sorted(b)的排序是臨時的,如果不用變量接受就會被系統回收掉。而a.sort()則是永久的,此時的sort()是對象a的一個方法。它們都有個默認的參數,reverse=False,如果使用reverse=True則會實現倒序輸出。 

sorted 語法:

sorted(iterable[, cmp[, key[, reverse]]])

參數說明:

  • iterable -- 可迭代對象。
  • cmp -- 比較的函數(python3中已被徹底移除),這個具有兩個參數,參數的值都是從可迭代對象中取出,此函數必須遵守的規則爲,大於則返回1,小於則返回-1,等於則返回0。
  • key -- 主要是用來進行比較的元素(python2.4開始提供,之前採用cmp),只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序。此函數將在每個元素比較前被調用。
  • reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。

返回值

返回重新排序的列表。

以下實例展示了 sorted 的使用方法:

>>> a = [5,7,6,3,4,1,2]

>>> b = sorted(a) # 保留原列表

>>> a

[5, 7, 6, 3, 4, 1, 2]

>>> b

[1, 2, 3, 4, 5, 6, 7]

>>> b = sorted(a,reverse=True)

>>> b

[7, 6, 5, 4, 3, 2, 1]

>>> L=[('b',2),('a',1),('c',3),('d',4)]

>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函數

[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

>>> sorted(L, key=lambda x:x[1]) # 利用key

[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

>>> sorted(students, key=lambda s: s[2]) # 按年齡排序

[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

>>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序

[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

以下實例展示了 sort 的使用方法:

>>> l=[('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]

>>> l

[('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]

>>> l.sort(key=lambda x : x[1], reverse=True)

>>> l

[('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

參考:https://blog.csdn.net/u013759354/article/details/80243705

三、python--sort()和sorted()高級排序

1、最簡單的排序

l = [5,2,3,1,4 ]

l .sort()

print(l) ##輸出:[1, 2, 3, 4, 5]

l.sort(reverse=True)#反序

print(l) ##輸出:[5, 4, 3, 2, 1]

2、字符串排序

StrList = ['Fast', 'fast', 'Is', 'is', 'Smooth', 'smooth']

2.1 一般字典序排列,但是大寫在前,小寫在後!!

StrList.sort()

print(StrList) ##字符串列表是按照第一個字符的大小排序的

##輸出:['Fast', 'Is', 'Smooth', 'fast', 'is', 'smooth']

>>> StrList = ['Fast', 'fast', 'Is', 'is', 'Smooth', 'smooth']

>>> StrList.sort()

>>> print StrList

['Fast', 'Is', 'Smooth', 'fast', 'is', 'smooth']

2.2忽略大小寫,按abcd順序

StrList.sort(key=str.lower)

print(StrList) ##輸出:['Fast', 'fast', 'Is', 'is', 'Smooth', 'smooth']

>>> StrList.sort(key=str.lower)

>>> print StrList

['Fast', 'fast', 'Is', 'is', 'Smooth', 'smooth']

2.3按照字符串長度排序

StrList.sort(key=len)

print(StrList)##輸出:['Is', 'is', 'Fast', 'fast', 'Smooth', 'smooth']

>>> StrList.sort(key=len)

>>> print StrList

['Is', 'is', 'Fast', 'fast', 'Smooth', 'smooth']

StrList.sort(key=len, reverse=True)#反序

print(StrList) ##輸出:['Smooth', 'smooth', 'Fast', 'fast', 'Is', 'is']

>>> StrList.sort(key=len, reverse=True)

>>> print StrList

['Smooth', 'smooth', 'Fast', 'fast', 'Is', 'is']

3、sorted配合lambda進行排序

>>> l = [[2, 2, 3], [1, 10, 3],[1, 4, 5], [5, 4, 9]]

>>> sorted(l)

[[1, 4, 5], [1, 10, 3], [2, 2, 3], [5, 4, 9]]

>>> sorted(l,key=lambda line:line[2])

[[2, 2, 3], [1, 10, 3], [1, 4, 5], [5, 4, 9]]

4、sort配合lambda進行排序

  若是可迭代序列的成員元素是對象,那麼同樣可以用sorted方法進行排序: 對象.成員變量

>>> class Student:

def __init__(self, name, grade, age):

self.name = name

self.grade = grade

self.age = age

def __repr__(self):

return repr((self.name, self.grade, self.age))

>>> student_objects = [

Student('john', 'A', 15),

Student('jane', 'B', 12),

Student('dave', 'B', 10)]

>>> sorted(student_objects, key=lambda student: student.age) # sort by age

[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

 5、如果第一個排序條件相同,則按照第二個條件排序

>>> a = [[2,3],[4,1],(2,8),(2,1),(3,4)]

>>> b = sorted(a,key=lambda x: (x[0], -x[1]))

>>> print(b)

[(2, 8), [2, 3], (2, 1), (3, 4), [4, 1]]

b = sorted(a,key=lambda x:(條件a,條件b))

6、字典排序:

1)、按照key排序

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,} for k in sorted(d): print(k,d[k])

d1 2

d2 4

d3 3

d4 1

2)、按照values排序

對dict_items進行排序

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,} res = sorted(d.items(),key=lambda d:d[1],reverse=True) print(res)

 [('d2', 4), ('d3', 3), ('d1', 2), ('d4', 1)]

3)、利用value排序:__getitem__

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,} for k in sorted(d,key=d.__getitem__): print(k,d[k])

d4 1

d1 2

d3 3

d2 4

反序:reverse=True

d = {'d1':2, 'd2':4, 'd4':1,'d3':3,} for k in sorted(d,key=d.__getitem__,reverse=True): print(k,d[k])

d2 4

d3 3

d1 2

d4 1

參考:https://www.cnblogs.com/kilometerwine/p/9712329.html

四、Python多關鍵字排序()

當排序關鍵字多於1個時,我們使用lambda表達式來描述關鍵字key

arr=[(1,4,3),(1,3,3),(2,1,4),(3,5,1)] arr.sort(key=lambda s:(s[0],s[1])) #兩個關鍵字排序 print(arr) # 可以看到輸出結果是根據列表中元組的第一項和第二項排序

[(1, 3, 3), (1, 4, 3), (2, 1, 4), (3, 5, 1)]

若我想讓第一個關鍵字正序,第二個關鍵字倒序,該怎麼辦呢?

arr=[(1,4,3),(1,3,3),(2,1,4),(3,5,1)]

arr.sort(key=lambda s:(s[0],-s[1])) #兩個關鍵字排序,在需要倒序排列的關鍵字前加`-`號

print(arr)

[(1, 4, 3), (1, 3, 3), (2, 1, 4), (3, 5, 1)]

>>> arr.sort(key=lambda s:(s[0],-s[1]))

>>> print arr

[(1, 4, 3), (1, 3, 3), (2, 1, 4), (3, 5, 1)]

>>> arr.sort(key=lambda s:(-s[0],-s[1]))

>>> print arr

[(3, 5, 1), (2, 1, 4), (1, 4, 3), (1, 3, 3)]

>>> arr.sort(key=lambda s:(-s[0],s[1]))

>>> print arr

[(3, 5, 1), (2, 1, 4), (1, 3, 3), (1, 4, 3)]

同理sorted()函數

>>> l = [[2, 2, 3], [1, 10, 3],[1, 4, 5], [5, 4, 9]]

>>> sorted(l,key=lambda line:(-line[0],line[1]))

[[5, 4, 9], [2, 2, 3], [1, 4, 5], [1, 10, 3]]

>>> sorted(l,key=lambda line:(-line[0],-line[1]))

[[5, 4, 9], [2, 2, 3], [1, 10, 3], [1, 4, 5]]

參考:https://blog.csdn.net/qq_28120673/article/details/98993207

五、python 字典的key與value進行交換

交換字典的key與value的兩種方法:

方法一: 使用dict.items()方式-字典生成式

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

dict_ori = {'A':1, 'B':2, 'C':3}

dict_new = {value:key for key,value in dict_ori.items()}

print(dict_new)

運行結果:

{1: 'A', 2: 'B', 3: 'C'}

方法二: 使用zip方法

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

dict_ori = {'A':1, 'B':2, 'C':3}

dict_new2= dict(zip(dict_ori.values(), dict_ori.keys()))

print(dict_new2)

運行結果:

{1: 'A', 2: 'B', 3: 'C'}

參考:https://www.cnblogs.com/dyl01/p/8563550.html

 

發佈了69 篇原創文章 · 獲贊 267 · 訪問量 152萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章