Python - 查找混合数组中每个值的出现(整数,列表)

Sho*_*len 4 python arrays for-loop

我有一个数组:x = [ [1, 2], 1, 1, [2, 1, [1, 2]] ] 我想在其中计算每次出现的数字1,并将该数字存储在变量中one_counter.x.count(1)只返回2次1,这是不够的.

我下面的代码提供我的目的并存储5one_counter,但它看起来凌乱,感觉unpythonic给我.

有什么建议我如何改进其pythonicity并将其扩展到更多维列表?

谢谢!

x = [[1, 2], 1, 1, [2, 1, [1, 2]]]

one_counter = 0

for i in x:
    if type(i) == list:
        for j in i:
            if type(j) == list:
                for k in j:
                    if k == 1:
                        one_counter += 1

            else:
                if j == 1:
                    one_counter += 1

    else:
        if i == 1:
            one_counter += 1
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

你可以使用递归:

def flatten_count(iterable, element):
    count = 0
    for item in iterable:
        if item == element:
            count += 1
        if isinstance(item, list):
            count += flatten_count(item, element)
    return count
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

def flatten_count(iterable, element):
    return sum(
        flatten_count(item, element) if isinstance(item, list) else item == element
        for item in iterable 
    )
Run Code Online (Sandbox Code Playgroud)

使用这样:

>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
>>> print(flatten_count(x, 1))
5
Run Code Online (Sandbox Code Playgroud)