Python3各種數據結構下的排序及去重彙總

**
0.Array數組的排序;
1.List的排序;
2.dict的排序;
3.DataFrame和Series的排序;**
4.List的元素去重
5.DataFrame的元素去重
6.List的元素去重

0.Array數組的排序
Numpy提供數組的排序和查找:

import numpy as mp
a=np.random.randn(5)
np.sort(a)

b=np.random.randn(3,3)
np.sort(b,axis=0)

#sort() 函數的order參數定義排序的關鍵字。現在有小明、小張、小王、小李4位同學的身高和體重數據。
dtype=[('name','U10'),('height',float),('weight',int)]
valuess=[('小明',170.0,58),('小張',165.0,60),('小李',178.0,70),('小王',170.0,65)]
c=np.array(valuess,dtype=dtype)
np.sort(c,order=['height','weight'])

#查找
a=np.array([1,4,9,10,25])
np.searchsorted(a,9) #返回值對應的索引

#數組的填充
a=np.arange(12).reshape(4,3)
b=np.arange(3)
d=a+b #數組的填充,形狀上做加法

np.loadtxt('out.txt',delimiter=',')  #讀取文本中的數組

#解線性方程組
x1+2x2=2
2x1-x2=4
import numpy.linalg as LA
A=np.array([[1,2],[2,-1]])
B=np.array([2,4])
LA.solve(A,B) 	#解線性方程組

q=np.diag((4,5,6))
x,y=LA.eig(q)  #求特徵值和特徵向量

1.List的排序
······使用 list.sort() 方法,此方法爲就地排序(並且返回 None 來避免混淆)。通常來說這不如 sorted() 方便——但是當你不需要保留原始列表的時候,這種方式略高效一些。
······另外一個區別是 list.sort() 方法只可以供列表使用,而 sorted() 函數可以接受任意可迭代對象(iterable)。

line="['DB00125',  'DB01686', 'DB01835', 'DB01997', 'DB02044', 'DB02207','DB00155', 'DB01110', 'DB01234', 'DB02234', 'DB02462', 'DB02533', 'DB03144', 'DB03271', 'DB03449', 'DB02539', 'DB02644', 'DB02692', 'DB03100', 'DB03953', 'DB04400', 'DB04534', 'DB05214', 'DB05252', 'DB06879', 'DB06916', 'DB07002', 'DB07003', 'DB07007', 'DB07008', 'DB07318', 'DB07388', 'DB07389', 'DB07405', 'DB08214',  'DB07011', 'DB07029', 'DB07306','DB08750', 'DB08814']"
zhou=line.replace('[','').replace(']','').replace("'",'').strip().replace(' ','').split(',')
zhou.sort(reverse=False)  #List專有的排序函數,並且不需要重新開闢新的空間即可完成排序功能    
#reverse=False爲升序排序,reverse=True爲降序排序

line="['DB00125',  'DB01686', 'DB01835', 'DB01997', 'DB02044', 'DB02207','DB00155', 'DB01110', 'DB01234', 'DB02234', 'DB02462', 'DB02533', 'DB03144', 'DB03271', 'DB03449', 'DB02539', 'DB02644', 'DB02692', 'DB03100', 'DB03953', 'DB04400', 'DB04534', 'DB05214', 'DB05252', 'DB06879', 'DB06916', 'DB07002', 'DB07003', 'DB07007', 'DB07008', 'DB07318', 'DB07388', 'DB07389', 'DB07405', 'DB08214',  'DB07011', 'DB07029', 'DB07306','DB08750', 'DB08814']"
zhou=line.replace('[','').replace(']','').replace("'",'').strip().replace(' ','').split(',')
zhou1=sorted(zhou)
zhou1[::-1] #跟原來序列反序,如果是已經排好序則是逆序排序
zhou1=sorted(zhou,reverse=True)


sorted((3,8,6,1,4,9,2)) #傳入tuple()數據結構
sorted([3,8,6,1,4,9,2]) #傳入list()數據結構
sorted(['zhou','shou','zjp','apple','email'])
sorted('平生風義兼師友萬里高飛雁與鴻') #漢字的排序效果全無
sorted('happy life every day')

student_tuples = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),('have', 'C', 24) ] 
student_tuples_sorted = sorted(student_tuples, key=lambda student: student[2]) #實際上傳入的是list(),只不過list中每個元素是一個tuple對象,按照tuple對象中的第三個元素的值來做升序排序

x = ['aaa', 'a', 'aa']
x.sort(key=len)          #key=指定的 "排序規則"---------一個函數對象

sorted("This is a test string from Andrew".split(), key=str.lower)

#使用 list.sort() 方法,此方法爲就地排序(並且返回 None 來避免混淆)。通常來說這不如 sorted() 方便——但是當你不需要保留原始列表的時候,這種方式略高效一些。
#另外一個區別是 list.sort() 方法只可以供列表使用,而 sorted() 函數可以接受任意可迭代對象(iterable)。

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),
    Student('have', 'C', 24),
]
sorted(student_objects, key=lambda student: student.age) 


#operator 模塊有 itemgetter()、attrgetter() 和 methodcaller() 函數。

from operator import itemgetter, attrgetter
sorted(student_tuples, key=itemgetter(2))  
sorted(student_objects, key=attrgetter('age')) 
sorted(student_objects, key=attrgetter('grade', 'age'), reverse=True)

#排序是保證爲穩定的,也就是說,當多條記錄擁有相同的 key 時,原始的順序會被保留下來
data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
sorted(data, key=itemgetter(0))

decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)]
decorated.sort()
[student for grade, i, student in decorated]  

2.dict的排序

dict1={'a':2,'e':3,'f':8,'d':4}
dict2 = sorted(dict1,reverse=True) #默認按照value做排序,返回鍵的順序.


dict1={'a':2,'e':3,'f':8,'d':4}
list1= sorted(dict1.keys(),reverse=True) #dict1.keys()本質上是可迭代對象,可以認爲是list等等。
type(dict1.keys())

dict1={'a':2,'e':3,'f':8,'d':4}
list1= sorted(dict1.items(),key=lambda x:x[1]) #這樣形式的字典排序後,返回的結果是一個list(),list中的元素是tuple對象,tuple對象的元素分別是字典的key和value。

3.DataFrame和Series的排序
對DataFrame的各列做 逐列升序排序

import pandas as pd 
x = pd.DataFrame({"x1":[1,2,2,3],"x2":[4,5,2,1]}) 
x.sort_index(by = ["x1","x2"],ascending = [True,False])   #DataFrame中指定某些列的排序協議:如指定x1屬性列做升序,x2屬性列做降序
x.sort_values(by=["x1","x2"], axis=0, ascending=[False,True], inplace=False, kind='quicksort', na_position='last') #指定DataFrame的某兩個屬性列的排序
x.sort_values(by=x.columns.tolist(), axis=0, ascending=[False,True], inplace=False, kind='quicksort', na_position='last') #對DataFrame的各列做逐列升序排序

#針對DataFrame的單個屬性列=Series,sorted和sort_values依然都可以使用
x.sort_values(by=["x1"], axis=0, inplace=False, kind='quicksort', na_position='last') #只對某個屬性列來做升序排序
sorted(x['x1'])
list(x['x1']).sort() #Series()要想使用sort()函數就必須做數據結構的轉換,數據結構的轉換往往會帶來很好的編程體驗和鏈式調用的便捷。

4.List的元素去重

#列表去重,不改變原來的順序,還可以使用一個空列表把原列表裏面不重複的數據"裝起來",例如:
#方法1
from functools import reduce
ids = [1,4,3,3,4,2,3,4,5,6,1]
func = lambda x,y:x if y in x else x + [y]
zhou=list(reduce(func, [[], ] + ids))

#方法2
list2 = []
list1 = [1,2,3,2,2,2,4,6,5]
for i in list1:
    if i not in list2:
        list2.append(i)

5.DataFrame的元素去重
df1=pd.DataFrame(all_drugs1,columns=[‘drugId’,‘side_effect’])
df1=df1.drop_duplicates([“side_effect”],keep=“first”) #DataFrame元素的去重處理

6.List的元素去重
list(set(序列對象))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章