列表排序/去重

要求

1.正數(shù)在前負(fù)數(shù)在后
2.整數(shù)從小到大
3.負(fù)數(shù)從大到小

示例:
排序前[7, -8, 5, 4, 0, -2, -5]
排序后[0, 4, 5, 7, -2, -5, -8]
補(bǔ)全代碼:
  sorted(lst , key= lambda x: ____ )

詳解:

>>> items = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
>>> sorted(items)
[(0, 'B'), (0, 'a'), (1, 'A'), (1, 'B'), (2, 'A')]

默認(rèn)情況下內(nèi)置的sort和sorted函數(shù)接收的參數(shù)是元組時(shí),他將會(huì)先按元組的第一個(gè)元素進(jìn)行排序再按第二個(gè)元素進(jìn)行排序。 然而,注意到結(jié)果中(0, 'B’)在(0, 'a')的前面。這是因?yàn)榇髮懽帜窧的ASCII編碼比a小。然而,假設(shè)你想要一些更人性的排序并且不關(guān)注大小寫。你或許會(huì)這么做:

>>> sorted(items, key=str.lower)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor 'lower' requires a 'str' object but received a 'tuple'

元組中第一項(xiàng)是數(shù)字,不能使用lower這個(gè)方法;錯(cuò)誤的原因提示的很明顯了,是因?yàn)槟銈鬟f的是一個(gè)元組,而元組是沒有l(wèi)ower這個(gè)方法的

sorted(items, key=lambda x: x.lower() if isinstance(x, str) else x) 
先判斷一下是不是 str 如果不是 直接處理

但這樣太麻煩了,別忘了,lambda 是一個(gè)函數(shù),當(dāng)返回值多于1項(xiàng)的時(shí)候,就會(huì)形成一個(gè)元祖

lambda 的正確用法:輸入一個(gè)元祖,返回的元祖讓字符串全部小寫
>>> sorted(items, key=lambda x: (x[0], x[1].lower()))
[(0, 'a'), (0, 'B'), (1, 'A'), (1, 'B'), (2, 'A')]

我確信你知道你可以倒序排列,僅僅使用sorted(items, reverse=True, …),但是你怎么根據(jù)關(guān)鍵字來進(jìn)行不同的排序?

使用lambda函數(shù)返回元組的技巧,下面是一個(gè)我們排序一個(gè)稍微高級(jí)的數(shù)據(jù)結(jié)構(gòu):

>>> peeps = [{'name': 'Ted', 'salary': 500}, {'name': 'Bill', 'salary': 1000}, {'name': 'Bill', 'salary': 500}]

現(xiàn)在,使用lambda函數(shù)返回一個(gè)元組的特性來排序:

>>> sorted(peeps, key=lambda x: (x['name'], x['salary']))
[{'name': 'Bill', 'salary': 500}, {'name': 'Bill', 'salary': 1000}, {'name': 'Ted', 'salary': 500}]

很有意思,對吧?Bill 在Ted的前面,并且500在1000的前面。但是如何在相同的 name 下,對 salary 反向排序?很簡單,對它取反:

>>> sorted(peeps, key=lambda x: (x['name'], -x['salary']))
[{'salary': 1000, 'name': 'Bill'}, {'salary': 500, 'name': 'Bill'}, {'salary': 500, 'name': 'Ted'}]
當(dāng)然這也可以進(jìn)行簡寫
>>> sorted(peeps, key=lambda x:  -x['salary'])
這有同樣的效果

刪除列表里的重復(fù)值

參考 https://blog.csdn.net/yang9520/article/details/79569910

  • 方法1:無法保持順序

使用set函數(shù),s=set(list),然后再list(s).

  • 方法2:使用字典函數(shù): 保持順序
   a=[1,2,4,2,4,5,6,5,7,8,9,0]
     b={}
     b=b.fromkeys(a)
     c=list(b.keys())
     print('去重后的list為:',c)
  • 方法3:append 保持順序
def delList(L):
    L1 = []
    for i in L:
        if i not in L1:
            L1.append(i)
    return L1    
 
print(delList([1,2,2,3,3,4,5]))
print(delList([1,8,8,3,9,3,3,3,3,3,6,3]))
  • 方法4:count,remove
def delList(L):
    for i in L:
        if L.count(i) != 1:
            for x in range((L.count(i)-1)):
                L.remove(i) 
    return L
 
print(delList([1,2,2,3,3,4,5]))
print(delList([1,8,8,3,9,3,3,3,3,3,6,3]))
  • 方法5:
a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a.sort()
last=a[-1]
for i in range(len(a)-2,-1,-1):
    if last==a[i]:
        del a[i]
    else:
        last=a[i]
 
print(a)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容