Python中List的最小值和最大值(不使用min / max函数)

时间:2013-03-01 00:44:47

标签: python algorithm minmax

我想知道是否有办法找到min&不使用Python中的min / max函数的最大列表。所以我用递归写了一个小代码。我的逻辑很天真:我做了两个堆栈(min_stack和max_stack),它们在每次递归调用期间跟踪最小值和最大值。我有两个问题:

  1. 有人可以帮我估算代码的复杂程度吗?
  2. 有更好的方法吗?是否会使用mergesort / quicksort对列表进行排序,并选择第一个和最后一个元素来提供更好的性能?
  3. 谢谢

    这是我在Python中的尝试:

    minimum = []
    maximum = []
    
    # Defining Stack Class
    class Stack:
        def __init__(self) :
            self.items = []
    
        def push(self, item) :
            self.items.append(item)
    
        def pop(self) :
            return self.items.pop()
    
        def access(self, index):
            return self.items[index]
    
        def isEmpty(self) :
            return (self.items == [])
    
        def length(self):
            return len(self.items)
    
    def minmax(input_list):
        # make two stacks, one for min and one for max
        min_stack = Stack()
        max_stack = Stack()
        # comparing the first two elements of the list and putting them in appropriate stack
        if input_list[0]<input_list[1]:
            min_stack.push(input_list[0])
            max_stack.push(input_list[1])
        else:
            max_stack.push(input_list[0])
            min_stack.push(input_list[1])
    
        # Pushing remaining elements of the list into appropriate stacks. 
        for i in range(2, len(input_list)):
            if input_list[i] < min_stack.access(-1):
                min_stack.push(input_list[i])
            else:
                max_stack.push(input_list[i])
    
        # to find minimum
        minlist = []
        while min_stack.length() > 0:
            minlist.append(min_stack.pop())
    
        # to find maximum
        maxlist = []
        while max_stack.length() > 0:
            maxlist.append(max_stack.pop())
    
        if len(minlist) > 1:
            minmax(minlist)
        else:
            minimum.append(minlist)
    
    
        if len(maxlist) > 1:
            minmax(maxlist)
        else:
            maximum.append(maxlist)
    
    def main():
        input_list = [2, 0, 2, 7, 5, -1, -2]
        print 'Input List is: ', input_list
        minmax(input_list)
    
    print 'Global Minimum is: ', minimum[0]
    print 'Global Maximum is: ', maximum[len(maximum)-1]
    
    if __name__ == "__main__":
        main()
    

7 个答案:

答案 0 :(得分:3)

当然,使用sorted()对于中等大小的列表来说是可靠,快速编写和高性能的,因为它是内置的。对于大型列表,O(n)算法会更快,例如:

def minmax1 (x):
    # this function fails if the list length is 0 
    minimum = maximum = x[0]
    for i in x[1:]:
        if i < minimum: 
            minimum = i 
        else: 
            if i > maximum: maximum = i
    return (minimum,maximum)

print(minmax1([9,8,7,6,5,4,3,2,1,11,12,13,14,15,16,17,18,19]))
print(minmax1([1]))
print(minmax1([2, 0, 2, 7, 5, -1, -2]))

...输出为:

(1, 19)
(1, 1)
(-2, 7)

我有兴趣检查两种替代品的性能。在运行Windows XP和Python 3.2.3的PC上,我发现排序方法比上面定义的minmax1()函数更快,对于少于500个元素的列表,但对于更长的列表,O(n){{ 1}}更快。我的计时测试代码如下:

minmax1()

答案 1 :(得分:1)

为了找到最大值,我们可以使用以下逻辑:

def mx(y):
    max_n = y[0] # initial the max to the first element

for i in range(len(y)-1): # for every element check if its greater than max.
    if y[i+1]>max_n:
        max_n = y[i+1] # if so, assign max to the value
return(max_n) 
      

答案 2 :(得分:0)

仅使用递归查找列表的最小值和最大值。

上周我有类似的任务,我将代码分为三部分。

  

第1步:在列表中找到最小值

def RecursiveMin(L):
if len(L)==2:
    if L[0]<L[1]:
        return L[0]
    else:
        return L[1]
else:
    X= RecursiveMin(L[1:])
    if L[0]<X:
        return L[0]
    else:
        return X
  

第2步:使用升序(从最小到最大)对列表进行排序

def Sort(x):
L=sorted(x)
if x==L:
    return x
else:
    i=0
    for i in range (len(x)):
        if x[i] > x[i+1] :
            break

    unsortedPart = x[i:]
    R = RecursiveMin(unsortedPart)
    I = unsortedPart.index(R)

    for j in range (len(x)):
        if x[j] > R :
            del x[(I+i)]
            x.insert(j,R)
            break

    return Sort(x)

(我之前回答了一个排序列表问题并提供了相同的代码。所以请不要因为我自己的代码标记我的抄袭 Likn:Finding minimum element in a list (recursively) - Python)。

  

**步骤3:使用参数创建一个新函数,无论用户是想要最小值还是最大*

def minMax(lst,user):
    if user == min:
       return Sort(lst)
    elif user == max:
       s = Sort(lst)
       return s[::-1]

最后一步不是递归的,但如果将所有三个步骤编译成一个函数,它将是“1递归函数”。 PS如果你的问题只是在列表中找到最小值和最大值,你可以跳过第2步并对第1步第3步进行一些更改< /强>

答案 3 :(得分:0)

如果使用sorted()函数,只需调用第一个索引以获取最小值,最后一个索引以获取最大值。不需要for循环。

def minimum(x):
    x = sorted(x)
    return x[0]

def maximum(x):
    x = sorted(x)
    return x[-1]

print(minimum([2, -5, 79, 20, -67])
print(maximum([45, -78, 950, 39, -567])

输出为:

-67
950

答案 4 :(得分:0)

这将非常简单并且易于理解。希望对您有帮助。

arr = []
num = int(input("Enter number of elements in list: ")) 
for i in range(0, num): 
    ele = int(input("Enter elements: ")) 
    arr.append(ele)

min = arr[ 0 ]
for a in arr:
    if a < min:
        min = a
print ("The minimum number in the list is: ", min)

max = arr[0]
for a in arr:
    if a > max:
        max = a
print("The maximum number in the lit is: ", max)

答案 5 :(得分:0)

  

有人要求我使用Stacks作为锻炼的方式来实现它。

令我惊讶的是,有几种解决方案需要通过列表的多次通过来确定最小值和最大值。这是一个简单的Python 3递归解决方案,每个OP使用 stacks ,只允许一次遍历列表:

def minmax(array, minimum=None, maximum=None):

    head, *tail = array

    if minimum is None:
        minimum = [head]
    elif head < minimum[-1]:
        minimum.append(head)

    if maximum is None:
        maximum = [head]
    elif head > maximum[-1]:
        maximum.append(head)

    if tail:
        return minmax(tail, minimum, maximum)

    return minimum.pop(), maximum.pop()

if __name__ == "__main__":

    array = [2, 0, 2, 7, 5, -1, -2]
    minimum, maximum = minmax(array)
    print(array, minimum, maximum)

    array = [13]
    minimum, maximum = minmax(array)
    print(array, minimum, maximum)

    array = [9, 8, 7, 6, 5, 4, 3, 2, 1, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    minimum, maximum = minmax(array)
    print(array, minimum, maximum)

尽管堆栈不是使该代码正常工作的必要条件。

答案 6 :(得分:0)

def inIntervalle(liste, min, max):
    liste_intervalle = []
    for i in range(len(liste)):
        if liste[i] < max and liste[i] > min:
            liste_intervalle.append(liste[i])
    return liste_intervalle