簡體   English   中英

帶有字符串和整數的列表上的最大/最小功能

[英]max/min function on list with strings and integers

我有一個包含字符串和整數的列表,想要找到整數的最小值,沒有列表切片。 有解決方法嗎?

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

非常感謝!

您可以使用生成器表達式過濾非數字:

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

產量

3

這是使用自定義key直接使用maxmin內置函數的方法:

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

細節

對於min,請將以下列表理解視為使用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)]

您可以將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) - {'-'})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM