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

时间:2011-10-09 07:25:33

标签: python arrays for-loop

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

我的下面的代码符合我的目的并在5中存储one_counter,但它看起来很麻烦,对我来说是不熟悉的。

有什么建议我如何改进其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

3 个答案:

答案 0 :(得分: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

或者更简洁:

def flatten_count(iterable, element):
    return sum(
        flatten_count(item, element) if isinstance(item, list) else item == element
        for item in iterable 
    )

像这样使用:

>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
>>> print(flatten_count(x, 1))
5

答案 1 :(得分:3)

一个hacky解决方案,通过将数据类型转换为字符串来工作: http://codepad.org/vNEv6B8M

import re
x = [ [1, 2], 1, 1, [2, 1, [1, 2]] ]
nums = [int(i) for i in re.findall(r'\d+', str(x))]
print(nums.count(1))

答案 2 :(得分:2)

我认为最好将此任务分为两部分。

第1部分

第1部分是创建一个将输入列表展平的生成器。

def flatten_list(L):
    for i in L:
        if isinstance(i,list):
            for j in flatten_list(i):
                yield j
        else:
            yield i

测试输出:

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

for i in flatten_list(x):
    print i

输出:

1
2
1
1
2
1
1
2

第2部分

第2部分是使用展平列表来计算其中1的出现次数:

print(sum(i==1 for i in flatten_list(x))) 

输出:

5

请注意,如果i==1,则True会返回i=1;如果False不等于i,则1会返回True。但1等于False0等于sum,因此True只计算5次出现次数(相等)在这种情况下为{{1}}。