Python 嵌套列表和计数()-后续问题

Python 嵌套列表和计数()-后续问题,python,nested-lists,Python,Nested Lists,原始问题的链接: 我正在测试接受答案的代码,发现它不适用于包含字符串的列表 接受答案的代码: def flatten(seq,container=None): if container is None: container = [] for s in seq: if hasattr(s,'__iter__'): flatten(s,container) else: container

原始问题的链接:

我正在测试接受答案的代码,发现它不适用于包含字符串的列表

接受答案的代码:

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
我理解递归,但我不知道为什么会发生这种错误。起初,我认为它与“\uuu iter\uuu”有关,但我非常确定字符串是可编辑的,因为我已经检查过了

作为参考,我使用的是Python 3.6.4


我还是Python新手,请对我好一点:)

字符串对于
flatte
函数来说是个问题,因为它们是可编辑的,但是当你在字符串中迭代时,你总是会得到另一个字符串。即使是一个单字符的字符串也仍然是可编辑的,并生成其自身的副本(另一个单字符字符串)

因此,您需要更改是否应该递归的检查。您需要明确排除字符串,而不是在找到iterable对象时递归:

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

值得一提的是:最初的答案是针对Python2的,在Python2.x中,
hasattr(stringobj,'.\uuu iter'.''.
返回
False