在嵌套列表中查找最低值?

时间:2014-12-03 01:55:02

标签: python list int nested iterable

我试图编写一个获取列表的函数,并可以打印该列表中的最小整数。现在我试图弄清楚如何使用嵌套列表,如果最低数字在其中一个嵌套列表中,那么整体它将打印该数字。我的代码在这里:

def listMin():
list2 = [3,4,[2,99,8],7]

for i in range (len(list2)):
    if type(list2[i]) == type([]):



        y=min(i)
        list2.append(y)
        print "hello"
    if len(list2)== 0:
        return None
    else:


        x= min(list2)
        print x


listMin()

虽然这看起来应该打印数字2但它没有,只是在它到达嵌套列表时给我一个错误说:

TypeError: 'int' object is not iterable

我尝试了很多东西,但我很难知道为什么这种东西不起作用。

4 个答案:

答案 0 :(得分:1)

通常,您可以展平列表列表并在展平列表中搜索min。有许多扁平化的配方。这是我从here获得的一个。

import collections

def flatten(iterable):
    for el in iterable:
        if isinstance(el, collections.Iterable) and not isinstance(el, str): 
            yield from flatten(el)
        else:
            yield el

list2 = [3,4,[2,99,8],7]

print(list(flatten(list2)))
# [3, 4, 2, 99, 8, 7]
print(min(flatten(list2)))   
# 2

这也适用于多个嵌套列表,例如:

list2 = [3,4,[2,99,8,[-1,-2]],7]

print(list(flatten(list2)))
# [3, 4, 2, 99, 8, -1, -2, 7]
print(min(flatten(list2)))  
# -2 

答案 1 :(得分:1)

Nested One Deep

在您的示例中,列表仅嵌套一个深度。如果是这种情况,请尝试:

>>> list2 = [3,4,[2,99,8],7]
>>> min(x if isinstance(x, int) else min(x) for x in list2)
2

任意深度的嵌套

如果允许更深的嵌套,请定义此递归函数:

>>> def rmin(lst): return min(x if isinstance(x, int) else rmin(x) for x in lst)
... 

在操作中:

>>> rmin(list2)
2

或者,通过更深的嵌套:

>>> list3 = [3,4,[[2,99],8],7]
>>> rmin(list3)
2
>>> list4 = [3, 4, [[2, [99, 1]], 8], 7]
>>> rmin(list4)
1

如何运作

函数rmin由单行组成:

return min(x if isinstance(x, int) else rmin(x) for x in lst)

正如您所看到的,这是一个列表理解,它会查看列表x的每个值lst

让我们将min的论点分成两部分。第一个是:

x if isinstance(x, int) else rmin(x)

如果x是整数,则返回x。否则,它会在rmin上调用x。在后一种情况下,rmin 以递归方式查看x中的每个值并返回最小值。

min论证的第二部分是:

for x in lst

这只是列表理解的常用方法。它依次提取lst中的每个值,并将其分配给x

答案 2 :(得分:0)

问题是由行

引起的
y=min(i)

其中i是整数但不是列表。您可能需要y = min(list2[i])

请注意,虽然您已将此y附加回原始列表,但循环不会到达新添加的元素,因为i只会达到列表的原始长度。< / p>

使用一些简单的Python习语,您的原始想法可以用更易读的方式表达如下:

def listMin():
    lst = [3,4,[2,99,8],7]
    for x in lst:
        if type(x) == list:
            lst.append(min(x))
    print min(lst)


listMin()

答案 3 :(得分:0)

当我需要做类似的事情时,我写了以下内容:

import copy

def nestedMin(list_):
  target_list = copy.deepcopy(list_)  # to keep original list unchanged
  for index in range (len(target_list)):
    if type (target_list[index]) is list:
      target_list[index] = nestedMin(target_list[index])

  return min(target_list)

我知道效率不高,不断进行深度检查;但它的可读性和完成工作:)

示例:

list1 = [2,3,[4, -5, [7, -20]]]
print nestedMin(list1) # prints -20
print list1  # prints [2, 3, [4, -5, [7, -20]]]