我有一个数组: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
答案 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部分是创建一个将输入列表展平的生成器。
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部分是使用展平列表来计算其中1
的出现次数:
print(sum(i==1 for i in flatten_list(x)))
输出:
5
请注意,如果i==1
,则True
会返回i=1
;如果False
不等于i
,则1
会返回True
。但1
等于False
且0
等于sum
,因此True
只计算5
次出现次数(相等)在这种情况下为{{1}}。