我想编写一个函数,该函数接受一个由数字和列表组成的列表,该列表又可以包含数字和列表,依此类推...,然后返回列表中某处的数字总数。
示例:[1,[[[0,2],7,3],5,[1,2]],3]
中包含9个数字。
到目前为止,这是我的代码:
test=[1,[[[0,2],7,3],5,[1,2]],3]
def flatten(mylist):
counter = 0
for i in range(len(mylist)):
if type(mylist[i]) == int:
counter += 1
if type(mylist[i]) == list:
[item for sublist in mylist[i] for item in sublist]
counter += 1
return counter
我认为我需要递归平整子列表。但是我得到了错误:TypeError: 'int' object is not iterable
答案 0 :(得分:5)
一般的方法是首先测试一个项目是否可迭代。不幸的是,str
对象是可迭代的,而在大多数情况下,它们应计为一个项目,因此不应被展平。此方法可用于此测试:
def is_iterable(item):
"""tests whether `item` is an iterable that is not a string"""
try:
iter(item)
return not isinstance(item, str)
except TypeError:
return False
然后,您可以使用生成器和递归来展平可迭代对象:
def flatten(iterable):
for item in iterable:
if is_iterable(item):
yield from flatten(item)
else:
yield item
list(flatten([1,[[[0,2],7,3],5,[1,2]],3] ))
[1, 0, 2, 7, 3, 5, 1, 2, 3]
然后,您只需要另一个测试,即内置sum
和事实True
计为1,而False
计为0
sum(isinstance(item, int) for item in flatten(mylist))
答案 1 :(得分:1)
def count_ints_in_list(int_list):
def count(n):
if isinstance(n, int): # If it is an integer, add 1 to the count.
return 1
elif isinstance(n, str): # Ignore strings.
return 0
elif hasattr(n, '__iter__'): # If it is iterable, recursively call function.
return count_ints_in_list(n)
return 0
if not hasattr(int_list, '__iter__'):
return 0
return sum(count(n) for n in int_list) # Use a generator to sum the count of all integers.
>>> count_ints_in_list(test)
9
>>> count_ints_in_list('test')
0
# Works with lists, tuples, other non-string iterables.
>>> count_ints_in_list([1, [[(0,2), 7, 3], 5, (1,2)], 3])
9
答案 2 :(得分:1)
要计算元素,您不需要展平列表。只是
def count(lst):
try:
return sum(count(item) for item in lst)
except TypeError:
return 1
请注意,这是python中一种常见的方法,即假定该对象是可迭代的,并将其视为可迭代对象,而不是检查isinstance(my_list, list)
(“比请求权限更容易获得宽恕” )。