嵌套列表与计数()
我想知道在这个嵌套列表中,数字x出现了多少次。
如果列表是:
list = [1, 2, 1, 1, 4]
list.count(1)
>>3
这样做是可以的。但是如果列表是:
list = [[1, 2, 3],[1, 1, 1]]
那我该怎么得到数字1出现的次数呢?在这个例子中,答案是4。
8 个回答
16
itertools
和collections
这两个模块里有你需要的工具(可以用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