2

我应该使用“节点的极端模式”在节点列表中找到最小值。我不允许使用该min()功能。我想我需要使用某种循环或递归。这是数组的“极端模式”:

    largest = items[0]
    for i in range(0,len(items),1):
        if (items[i] > largest):
            largest = items[i]

但是这种模式不适用于像这样包含节点的列表:

    [1, [23, [53, [54, [5, None]]]]]

如何实现类似的模式以在上面的列表中找到最小值?

4

4 回答 4

3
curList = items
if curList:
    largest = items[0]
    while curList is not None:
        if (curList[0] > largest):
            largest = curList[0]
        curList = curList[1]
    print largest
于 2012-11-18T22:29:17.427 回答
3
def myMin(mylist):
    smallest = float('inf')
    for l in mylist:
        if isinstance(l,list):
            tmp = myMin(l)
            if tmp < smallest:
                smallest = tmp
        elif l < smallest:
            smallest = l
    if smallest == float('inf'):
        return None
    return smallest

修复了@Blckknght 的评论。

于 2012-11-18T22:31:18.740 回答
1

这是@aw4lly 答案的一个变体,它可以在 Python 3 中使用。

def myMin(lst):
    smallest = None
    for i in lst:
        if isinstance(i, list):
            i = myMin(i)
        if smallest is None or i is not None and i < smallest:
            smallest = i
    return smallest

这可以处理任何类型的嵌套列表,包括部分或完全空的列表(对于我们的目的,空列表是指除了其他“空”列表之外没有其他成员的列表)。空列表None作为它们的最小值返回,这与 Python 的标准函数不完全相同min(但它使递归更容易一些)。

>>> print(myMin([1, 2, 3, [4, [5], [], 0, [6, 7]], [[8], 9]]))
0
>>> print(myMin([[[],[[],[],[[],[]],]],[],[[]]]))
None
于 2012-11-18T23:00:31.040 回答
1
car = lambda lst: lst[0]  # value
cdr = lambda lst: lst[1]  # next list

lst = items
if lst:  # not empty
   largest = car(lst)
   while lst is not None:
         if largest < car(lst):
            largest = car(lst)
         lst = cdr(lst)
   print(largest)

例子

于 2012-11-20T06:36:24.757 回答