嵌套列表与计数()

33 投票
8 回答
63436 浏览
提问于 2025-04-16 16:38

我想知道在这个嵌套列表中,数字x出现了多少次。

如果列表是:

list = [1, 2, 1, 1, 4]
list.count(1)
>>3

这样做是可以的。但是如果列表是:

list = [[1, 2, 3],[1, 1, 1]]

那我该怎么得到数字1出现的次数呢?在这个例子中,答案是4。

8 个回答

16

itertoolscollections这两个模块里有你需要的工具(可以用itertools.chain来把嵌套的列表变平,使用collections.Counter来计数)

import itertools, collections

data = [[1,2,3],[1,1,1]]
counter = collections.Counter(itertools.chain(*data))
print counter[1]

可以用一个递归的扁平化函数来替代itertools.chain,这样可以处理任意深度的嵌套列表

import operator, collections

def flatten(lst):
    return reduce(operator.iadd, (flatten(i) if isinstance(i, collections.Sequence) else [i] for i in lst))

这里用reduce配合operator.iadd来代替sum,这样扁平化的过程只会构建一次,并且是在原地更新的

62

这段代码是用来处理一些数据的。它的主要目的是从一个地方获取信息,然后对这些信息进行一些操作,最后把结果输出。具体来说,它可能会从数据库、文件或者网络上获取数据,然后进行计算或者转换,最后把处理后的数据展示出来。

在编程中,常常需要用到这样的流程:获取数据、处理数据、输出结果。这个过程就像是做菜,首先要准备食材(获取数据),然后按照食谱进行烹饪(处理数据),最后把做好的菜端上桌(输出结果)。

如果你对这段代码有疑问,可以尝试逐行理解它的每个部分,看看每一行是在做什么,这样会帮助你更好地掌握编程的基本概念。

>>> L = [[1, 2, 3], [1, 1, 1]]
>>> sum(x.count(1) for x in L)
4
15

这里还有一种方法可以把嵌套的序列变成一维的。把序列变平后,计算里面有多少个项目就变得简单了。

def flatten(seq, container=None):
    if container is None:
        container = []

    for s in seq:
        try:
            iter(s)  # check if it's iterable
        except TypeError:
            container.append(s)
        else:
            flatten(s, container)

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

上面的代码会输出:

[1, 2, 3, 4, 5, 6, 7, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
1
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
12

撰写回答