带有字符串和整数的列表中的max / min函数

时间:2019-02-15 16:34:01

标签: python string list

我有一个包含字符串和整数的列表,想要找到整数的最小值,而没有列表切片。有解决方法吗?

arr = [5,3,6,"-",3,"-",4,"-"]    
for i in range(len(set(arr))):
        cut = min(arr)

非常感谢!

3 个答案:

答案 0 :(得分:13)

您可以使用生成器表达式过滤非数字:

arr = [5,3,6,"-",3,"-",4,"-"]
result = min(e for e in arr if isinstance(e, int))
print(result)

输出

3

答案 1 :(得分:6)

这是一种直接使用maxmin内置功能以及自定义key的方式:

arr = [5,3,6,"-",3,"-",4,"-"]
max(arr, key=lambda x: (isinstance(x,int), x))
# 6

对于min类似:

min(arr, key=lambda x: (not isinstance(x,int), x))
# 3

详细信息

对于分钟,请考虑以下列表理解为与key进行的转换的“等效”:

sorted([(not isinstance(x,int), x) for x in arr])

[(False, 3),
 (False, 3),
 (False, 4),
 (False, 5),
 (False, 6),
 (True, '-'),
 (True, '-'),
 (True, '-')]

因此min将是最低的元组,即(0,3)

对于max,最高将是(1,6)

sorted([(isinstance(x,int), x) for x in arr])

[(False, '-'),
 (False, '-'),
 (False, '-'),
 (True, 3),
 (True, 3),
 (True, 4),
 (True, 5),
 (True, 6)]

答案 2 :(得分:1)

您可以将list转换为set以加快计算速度:

min(i for i in set(arr) if isinstance(i, int))

基准:

setup = "arr = [5, 3, 6,'-', 3,'-', 4, '-'] * 1000"

solution1 = "min(i for i in set(arr) if isinstance(i, int))"
solution3 = "min(e for e in arr if isinstance(e, int))"
solution2 = "min(arr, key=lambda x: (not isinstance(x,int), x))"

print(timeit.timeit(setup=setup, stmt=solution1, number=10000))
print(timeit.timeit(setup=setup, stmt=solution2, number=10000))
print(timeit.timeit(setup=setup, stmt=solution3, number=10000))

输出:

1.0895615029
13.389633473
22.653398585

如果只有一种类型的字符串:

min(set(arr) - {'-'})