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 區別:
- sort 是應用在 list 上的方法,屬於列表的成員方法,sorted 可以對所有可迭代的對象進行排序操作。
- list 的 sort 方法返回的是對已經存在的列表進行操作,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。
- sort使用方法爲ls.sort(),而sorted使用方法爲sorted(ls)
- 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