我有一个包含字符串和整数的列表,想要找到整数的最小值,而没有列表切片。有解决方法吗?
arr = [5,3,6,"-",3,"-",4,"-"]
for i in range(len(set(arr))):
cut = min(arr)
非常感谢!
答案 0 :(得分:13)
您可以使用生成器表达式过滤非数字:
arr = [5,3,6,"-",3,"-",4,"-"]
result = min(e for e in arr if isinstance(e, int))
print(result)
输出
3
答案 1 :(得分:6)
这是一种直接使用max
和min
内置功能以及自定义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) - {'-'})