原始问题的链接: Nested List and count()
我正在测试接受的答案的代码,发现它不适用于包含字符串的列表。
接受的答案的代码:
def flatten(seq,container=None):
if container is None:
container = []
for s in seq:
if hasattr(s,'__iter__'):
flatten(s,container)
else:
container.append(s)
return container
c = flatten([(1,2),(3,4),(5,[6,7,['a','b']]),['c','d',('e',['f','g','h'])]])
print c
print c.count('g')
d = flatten([[[1,(1,),((1,(1,))), [1,[1,[1,[1]]]], 1, [1, [1, (1,)]]]]])
print d
print d.count(1)
我首先使用此输入进行了测试:
list1 = [[[1,2,3,4,5],[1,2,3,4,5]],[[1,2,3,4,5],[1,2,3,4,5]],[[1,2,3,4,5],[1,2,3,4,5]]]
它奏效了。
但是一旦我使用它:
list1 = [[[1,'2',3,4,5],[1,2,3,4,5]],[[1,2,3,4,5],[1,2,3,4,5]],[[1,2,3,4,5],[1,2,3,4,5]]]
注意:现在前2个是字符串。
它会产生此错误:
RecursionError: maximum recursion depth exceeded
我了解递归,但我不明白为什么会发生此错误。最初,我认为它与' __ iter __ '有关,但是我很确定字符串是可迭代的,因为我已经检查了。
作为参考,我使用的是Python 3.6.4。
我还是Python的新手,请对我好:)
答案 0 :(得分:2)
该字符串对于flatten
函数来说是一个问题,因为它们是可迭代的,但是当您在一个字符串中进行迭代时,您总是会得到另一个字符串。甚至一个字符串仍然可迭代,并产生其自身的副本(另一个字符串)。
因此,您需要更改是否应递归的检查。无需在找到可迭代对象时重复进行操作,而需要专门排除字符串:
if hasattr(s,'__iter__') and not isinstance(s, str):