Python - 在混合数组(整数,列表)中查找每次出现的值
Posted
技术标签:
【中文标题】Python - 在混合数组(整数,列表)中查找每次出现的值【英文标题】:Python - Finding each occurrence of a value in a mixed array (integers, lists) 【发布时间】: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 如果我说是我在练习、遇到障碍并寻求帮助,你会不高兴吗? 【参考方案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
)。
【讨论】:
感谢您分解它。我真的很感激。以上是关于Python - 在混合数组(整数,列表)中查找每次出现的值的主要内容,如果未能解决你的问题,请参考以下文章