嵌套列表和 count() - 后续问题

Nested List and count() - Follow-up question

A link 原题: 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的新手,请对我好:)

字符串对于 flatten 函数来说是一个问题,因为它们是可迭代的,但是当您在一个字符串中迭代时,您 总是 得到另一个字符串。即使是一个字符串仍然是可迭代的,并产生它自己的一个副本(另一个字符串)。

因此您需要更改检查是否应该递归。不是每次找到可迭代对象时都递归,而是需要专门排除字符串:

if hasattr(s,'__iter__') and not isinstance(s, str):