![](/img/trans.png)
[英]Find min/max values in a dataframe containing a mixture of integers and strings
[英]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
直接使用max
和min
內置函數的方法:
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.