對一個含正數負數列表統計及排序的問題
阿新 • • 發佈:2019-01-01
有一道Python面試題:已知列表,foo = [-5, 8, 0, 4, 9, -4, -20, -2, 8, 2, -4]
1). 求列表中整數,負數元素各多少個? 裡面如有重複元素,只算一個,比如,裡面有兩個8,只算一個
# 方法一: 先用filter過濾負數,再在set(foo)中取正數 >>> len(filter(lambda x:x>0, set(foo))) 4 >>> len(filter(lambda x:x<0, set(foo))) 4 # 方法二:int(x>0)的話為1,這是巧妙之處 >>> sum([int(x>0) for x in set(foo)]) 4 >>> sum([int(x<0) for x in set(foo)]) 4 # 方法三:列表推導的常用做法 >>> foo = [-5, 8, 0, 4, 9, -4, -20, -2, 8, 2, -4] >>> len([i for i in set(foo) if i > 0]) 4 >>> len([i for i in set(foo) if i < 0]) 4
2). 使用lambda函式對列表foo排序,輸出結果為[0,2,4,8,8,9,-2,-4,-4,-5,-20],正數從小到大,負數從大到小
# 方法一: >>> foo = [-5, 8, 0, 4, 9, -4, -20, -2, 8, 2, -4] >>> sorted(filter(lambda x:x>0, foo)) + sorted(filter(lambda x:x<0,foo), reverse=True) [2, 4, 8, 8, 9, -2, -4, -4, -5, -20] # 方法二: >>> foo = [-5, 8, 0, 4, 9, -4, -20, -2, 8, 2, -4] >>> sorted(filter(lambda x:x>0, foo)) + sorted(filter(lambda x:x<0,foo))[::-1] [2, 4, 8, 8, 9, -2, -4, -4, -5, -20] # 方法三: >>> foo = [-5, 8, 0, 4, 9, -4, -20, -2, 8, 2, -4] >>> sorted(foo, key=lambda x:(x<0, abs(x))) [0, 2, 4, 8, 8, 9, -2, -4, -4, -5, -20] # 方法四: >>> foo = [-5, 8, 0, 4, 9, -4, -20, -2, 8, 2, -4] >>> sorted(foo, key=lambda x:(int(x<0), abs(x))) [0, 2, 4, 8, 8, 9, -2, -4, -4, -5, -20]