簡體   English   中英

如何使用python內置的最大值和最小值函數將給定列表的最大值和最小值轉換為元組形式

[英]How to get max value and min value of a given list into tuple form with out using built in max and min function from python

我是 python 新手。我有像 data = [100,50,3,205,10] 這樣的值列表,我正在嘗試編寫單個函數,該函數將在不使用 min ,max 函數的情況下將最小值和最大值放入元組

這是我的代碼,當我執行此代碼時,我得到 ma,mi 值 (3,3) - 這是不正確的。

將數據傳遞給 findmax 函數

def findmax(data):
    a = data
    ma = a[0]
    mi = a[len(a)-1]
    k = 0
    while k != len(a):
        for i in range(0,len(a)):
            k = i+1
            if ma > a[i]:
                ma = a[i]
            continue
        for l in range(0,len(a)):
            if mi > a[l]:
                mi = a[l]
     print (ma,mi)

打印(findmax([100,50,3,205,10]))

這可能會有所幫助。 無需兩次循環輸入數據。

data = [100,50,3,205,10] 

def minmax(data):
    _min = data[0]
    _max = data[0]
    for i in range(len(data)):
        if _min > data[i]:
            _min = data[i]
        if _max < data[i]:
            _max = data[i]
    return (_min, _max)
def minmax(ls):
    if len(ls) == 0:
        return None, None # or some default val
    mini = maxi = ls[0]
    for val in ls[1:]:
        if val < mini:
            mini = val
        elif val > maxi:
            maxi = val
    return mini, maxi

這處理輸入列表長度為 0 的情況。另外,我認為 if-else-if 更有意義,因為如果值小於最小值,則執行下一次檢查沒有用。

您應該只能查看列表一次並保存最小值和最大值。

data = [100,50,3,205,10]

def findmax(data):
    a = data
    ma = a[0]
    mi = a[0]

    for item in data:
        if item > ma:
            ma = item

        if item < mi:
            mi = item

    return (ma,mi)

print(findmax(data))

這是一種使用 bithack 實現此目的的有趣方法,但是您從類似的東西中看到的任何性能改進都是微不足道的,以至於在可讀性和性能之間做出妥協是毫無意義的。

def findminmax(data):
    mi = ma = data[0]
    for value in data:
        mi = value if mi ^ ((value^mi) & -(value < mi))
        ma = value if value ^ ((ma^value) & -(ma < value))
    return mi, ma

這是通過一次讀取兩個值來單遍查找最小值和最大值的不同方法。 它不是每個項目執行 2 次比較,而是每 2 個項目執行 3 次比較。 這也使用迭代器在輸入中移動,並使用zip_longest地遍歷列表:

from itertools import zip_longest

def minmax(data):
    it = iter(data)
    _min = _max = next(it)
    for a, b in zip_longest(it, it, fillvalue=_min):
        if a > b:
            # swap items to make a <= b
            a, b = b, a
        if  a < _min:
            _min = a
        if b > _max:
            _max = b
    return _min, _max

當列表元素是整數或浮點數時,除非列表非常長,否則這種改進將無法衡量。 但是如果列表項是復雜的用戶對象,其中 > 和 < 操作可能涉及一些非常重要的工作量,這可能值得追求。

如果您的列表中有很多元素,Hello 循環可能會影響您的計算時間。 我建議用熊貓代替

import pandas as pd

然后使用您的數據創建一個 DataFrame:

df = pd.DataFrame({'Values':data})

使用此代碼,您將獲得最大值: print(df.loc[df['Values'].idxmax()]

你會得到:

205

希望這可以幫助 :))

您可以在一行中完成,盡管效率非常低,但具有排序和列表理解

minmax = [ (s[0],s[-1]) for s in [sorted(data)] ]

或者,更嚴重的是,您應該考慮獲得空列表的可能性。

minValue,maxValue = (data[:1] or [None])*2
for value in data[1:]:
    minValue = value if value < minValue else minValue
    maxValue = value if value > maxValue else maxValue

暫無
暫無

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

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