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

时间:2018-09-11 00:22:21

标签: python nested-lists

原始问题的链接: 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的新手,请对我好:)

1 个答案:

答案 0 :(得分:2)

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

因此,您需要更改是否应递归的检查。无需在找到可迭代对象时重复进行操作,而需要专门排除字符串:

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