1. 程式人生 > >對一個含正數負數列表統計及排序的問題

對一個含正數負數列表統計及排序的問題

有一道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]