对一个含正数负数列表统计及排序的问题

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值