我试图编写一个获取列表的函数,并可以打印该列表中的最小整数。现在我试图弄清楚如何使用嵌套列表,如果最低数字在其中一个嵌套列表中,那么整体它将打印该数字。我的代码在这里:
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
我尝试了很多东西,但我很难知道为什么这种东西不起作用。
答案 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)
在您的示例中,列表仅嵌套一个深度。如果是这种情况,请尝试:
>>> 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]]]