循环中的计数器 /list/ 如果它们一个接一个地计算相同的值 (python)
counter in loop /list/ count same vale if they are one after another (python)
该程序的想法是计算某些结构的生命周期(计算一个接一个的相同结构)但我在实现计数器或枚举函数时遇到问题,我不想计算所有结构的数量。我试过很多方法。现在我卡住了。
struct=[1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,] #input list of structures
list1=[] #list of lifetimes for struct 1
for i in range (0, len(struct)-1):
a=struct[i-1]
b=struct[i]
c=struct[i+1]
if a!=1 and b==1 and c!=1: # if it is one separated record
list1.append(1)
if a!=1 and b==1 and c==1: # for first record in sequence
list1.append('f')
if a==1 and b==1 and c==1: # for middle record in sequence
list1.append('m')
if a==1 and b==1 and c!=1: # for last record in sequence
list1.append('l')
print (list1)
它给我:[1, 1, 'f', 'm', 'm', 'l', 'f', 'l']
你能给我任何建议如何实施 counter 吗?
例如 ['f', 'm', 'm', 'l] (firs/middle/middle/last) 是从结构列表中的 [1, 1, 1, 1] 给出的,所以它是4条记录
得到 [1, 1, 4, 2]
抱歉,对于我的非编程语言,我是这个领域的初学者。
我搜索过任何类似的问题,但找不到。
您正在寻找这样的东西吗?
inlist = [1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,]
# 1 1 1--2--3--4 1--2
def lifetime(num):
output = []
count = 0
for x in inlist:
if x == num:
count += 1
else:
if count != 0:
output.append(count)
count = 0
if count != 0:
output.append(count)
print output
lifetime(1)
lifetime(2)
lifetime(3)
输出:
[1, 1, 4, 2]
[3, 1, 1]
[2, 1]
您可以使用 itertools.groupby()
按值对列表进行分组,然后 return 每个组具有给定值的计数:
from itertools import groupby
def ilen(iterable):
""" Return the length of an iterable """
return sum(1 for _ in iterable)
def lifetime(num, lst):
""" Return a list of counts for each group of num in lst """
return [ilen(g) for k, g in groupby(lst) if k==1]
示例:
>>> inlist = [1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,]
>>> lifetime(1, inlist)
[1, 1, 4, 2]
该程序的想法是计算某些结构的生命周期(计算一个接一个的相同结构)但我在实现计数器或枚举函数时遇到问题,我不想计算所有结构的数量。我试过很多方法。现在我卡住了。
struct=[1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,] #input list of structures
list1=[] #list of lifetimes for struct 1
for i in range (0, len(struct)-1):
a=struct[i-1]
b=struct[i]
c=struct[i+1]
if a!=1 and b==1 and c!=1: # if it is one separated record
list1.append(1)
if a!=1 and b==1 and c==1: # for first record in sequence
list1.append('f')
if a==1 and b==1 and c==1: # for middle record in sequence
list1.append('m')
if a==1 and b==1 and c!=1: # for last record in sequence
list1.append('l')
print (list1)
它给我:[1, 1, 'f', 'm', 'm', 'l', 'f', 'l']
你能给我任何建议如何实施 counter 吗?
例如 ['f', 'm', 'm', 'l] (firs/middle/middle/last) 是从结构列表中的 [1, 1, 1, 1] 给出的,所以它是4条记录
得到 [1, 1, 4, 2]
抱歉,对于我的非编程语言,我是这个领域的初学者。 我搜索过任何类似的问题,但找不到。
您正在寻找这样的东西吗?
inlist = [1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,]
# 1 1 1--2--3--4 1--2
def lifetime(num):
output = []
count = 0
for x in inlist:
if x == num:
count += 1
else:
if count != 0:
output.append(count)
count = 0
if count != 0:
output.append(count)
print output
lifetime(1)
lifetime(2)
lifetime(3)
输出:
[1, 1, 4, 2]
[3, 1, 1]
[2, 1]
您可以使用 itertools.groupby()
按值对列表进行分组,然后 return 每个组具有给定值的计数:
from itertools import groupby
def ilen(iterable):
""" Return the length of an iterable """
return sum(1 for _ in iterable)
def lifetime(num, lst):
""" Return a list of counts for each group of num in lst """
return [ilen(g) for k, g in groupby(lst) if k==1]
示例:
>>> inlist = [1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,]
>>> lifetime(1, inlist)
[1, 1, 4, 2]