【问题标题】:Python - Finding each occurrence of a value in a mixed array (integers, lists)Python - 在混合数组(整数,列表)中查找每次出现的值
【发布时间】:2011-12-03 20:39:51
【问题描述】:

我有一个数组: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

【问题讨论】:

  • 规模与这有什么关系?
  • @IgnacioVazquez-Abrams 我猜他过度使用了 Scale 这个词,他可能意味着将他的数据类型扩展到更多维度的列表中。
  • @DhruvPathak 是的,先生!我误解了它的规模。
  • 那么你是怎么得到这个列表的,为什么你需要这个计数?整个事情看起来很奇怪。
  • @Karl 如果我说是我在练习、遇到障碍并寻求帮助,你会不高兴吗?

标签: python arrays for-loop


【解决方案1】:

你可以使用递归:

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

【讨论】:

  • 非常感谢,马克!这很有意义,现在我更好地理解递归以及 isinstance() 的便利性。
【解决方案2】:

一个 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))

【讨论】:

    【解决方案3】:

    我认为最好把这个任务分成两部分。

    第 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,则i==1 返回True,如果i 不等于1,则返回False。但是True等于1,而False等于0,所以sum只计算True出现的次数(在这种情况下等于5)。

    【讨论】:

    • 感谢您分解它。我真的很感激。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多