Python:统计列表列表中的所有元素
我想写一个函数,它接受一个数字和列表的列表,它同样可以包含数字和列表,等等…,并返回列表中某个位置的数字总数 示例:Python:统计列表列表中的所有元素,python,Python,我想写一个函数,它接受一个数字和列表的列表,它同样可以包含数字和列表,等等…,并返回列表中某个位置的数字总数 示例:[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:
[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”对象不可iterable
通常的方法是首先测试一个项目是否可iterable。不幸的是,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
然后可以使用生成器和递归来展平iterable:
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] ))
然后,您只需要另一个测试,内置的sum
和事实True
分别计算为1和False
为0
sum(isinstance(item, int) for item in flatten(mylist))
一般的方法是首先测试一个项目是否合适。不幸的是,
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
然后可以使用生成器和递归来展平iterable:
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] ))
然后,您只需要另一个测试,内置的sum
和事实True
分别计算为1和False
为0
sum(isinstance(item, int) for item in flatten(mylist))
要计算元素,不需要展平列表。简单地
def count(lst):
try:
return sum(count(item) for item in lst)
except TypeError:
return 1
请注意,python中的一种常见方法是假设对象是可编辑的,并将其视为可编辑的,而不是检查
isinstance(my_list,list)
(“请求原谅比允许更容易”)。计算不需要展平列表的元素。简单地
def count(lst):
try:
return sum(count(item) for item in lst)
except TypeError:
return 1
请注意,python中的一种常见方法是假设对象是可编辑的,并将其视为可编辑对象,而不是检查
isinstance(my_list,list)
(“请求原谅比允许更容易”)。在列表理解中,它不做任何事情(因为没有为其值指定名称)您假设mylist[i]
的元素是列表(用于mylist[i]中的子列表…
)。如果mylist[i]
包含一个不可iterable元素,在您的特定情况下为整数,则会出现错误。在列表理解中,这不起任何作用(因为您没有为其值指定名称),您假设mylist[i]
的元素是列表(用于mylist[i]中的子列表…
)。如果mylist[i]
包含一个不可数元素,在您的特定情况下为整数,则会出现错误。您是否尝试过count(('abc',2))
@MaartenFabré:问题是“数字和列表”。与字符串无关。@blue\u注意,这是一个很好的计数数字的简短方法+1您尝试计数('abc',2))@MaartenFabré:问题是“数字和列表”。关于字符串什么都没有。@blue\u注意,这是一个很好的计数数字的简短方法+1注意,使用hasattr
检查\uiter\uuuu
方法很容易出错。请参见答案中的事实2。我知道这些问题,但觉得它们远远超出了问题的范围。请注意,使用hasattr
检查\uu iter\uuu
方法容易出错。请参见答案中的事实2。我知道这些问题,但觉得它们远远超出了问题的范围。