首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >嵌套的List和count()

嵌套的List和count()
EN

Stack Overflow用户
提问于 2011-04-29 13:06:57
回答 7查看 47.6K关注 0票数 27

我想得到x在嵌套列表中出现的次数。

如果列表是:

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

这样就可以了。但如果列表是:

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

如何获取1出现的次数?在本例中,为4。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-04-29 14:51:54

这是另一种扁平化嵌套序列的方法。一旦序列被展平,就可以很容易地检查项目的数量。

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
票数 14
EN

Stack Overflow用户

发布于 2011-04-29 13:13:29

>>> L = [[1, 2, 3], [1, 1, 1]]
>>> sum(x.count(1) for x in L)
4
票数 56
EN

Stack Overflow用户

发布于 2011-04-29 13:11:43

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

已使用带有operator.iaddreduce代替sum,以便只构建一次展平并就地更新

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5828123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档