|
[Original]
[Print]
[Top]
|
工作中遇到个问题: 统计对象总数
某个任务周期产生的不定数量的消息,
格式 [time, ObjID, ...] 其中time是记录时间 顺序递增; ObjID是对象标识 值由1-255循环
经过多个周期 可能得到的实际消息列表 如下:
//第一周期
t1, 1
t1, 2 注意: 两个t1 时间不一定完全相等
//第二周期
t2, 1
t2, 2
t2, 3
//第三周期
t3, 1
t3, 3 //释放了 2
.
//第N周期
tn, x (取1-255中任意值)
tn, y
...
tn, p 都同上
//第M周期
tm, x
tm, 255
....
=================================
下面的周期如果有新的对象 ObjID又从(1-255)中最小free的ID 开始递增标识
.....
问题是: 统计对象总数
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
如果对象ID 不重复 我原先的思路是使用dict
对每周期的ObjID dict[ObjID] = 1
最后统计 len(dict) 就是对象个数
但现在ObjID重复使用 一时找不到划分的方法 请教大家
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
按我的理解, 根据你给出的现有现有条件是无法解决这个问题的。
这个问题的关键就是确定不同周期里数值相同的ID是否是同一个ID。
如果不知道一个ID何时销毁的, 就无法区分下一个ID是不是新产生的。
需要确认两个条件,才能满足区分条件:
(1)知道周期的间隔。
(2)如果一个消息ID在N周期有,而在N+1消失,就可以认为消息ID销毁了。
而且必须满足数值相同的ID(但是不同ID)不能在相邻的周期出现。
|
|
|
----
(1)多回答问题。 (2)多提出问题。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
假定 ID循环 从1到8
list = [
1,2,3,
1,2,
1,4,5,6,
4,5,7,
4,5,8,
4,8,1,2,
8,1,2,
8,2,3,4,
8,2,3,4,
8,2,3,4,
8,5,6,7,
8,5,6,7,1,
8,5,6,7,1,2,
8,1,2,3,
8,1,2,4,5,6,
8,4,6,7,
8,4,6,7,1,
4,6,7,1,2,3,
4,6,1,3,5,
4,6,5,7
]
class newperiods:
def __init__(self):
self.IDs = []
self.theLastID = 0
def output(self, pl):
print pl
for ID in pl:
if self.IDs.count(ID) == 0 :
self.theLastID = ID #新添加的ID
self.IDs.append(ID)
else:
# 判断为处于下一个周期 保存上周期ID list
print self.theLastID, ':', self.IDs
self.IDs = [];
self.IDs.append(ID) #新添加的ID
print self.theLastID, ':', self.IDs,
if __name__ == '__main__':
p = newperiods()
p.output(list)
p.output(list1)
基本能够把各个周期分开 除以下情况:
list1 = [
1,2,3,
1,2,
1,4,5,6,
4,5,7,
4,5,8,
1,2,3,4 // 这里最后一个4应该判别为新ID 问题是这个情况是否允许出现 我要进一步确认
// 目前程序 将其判断为与上周期合并 4 5 8 1 2 3为同周期 最后一个4 被分到下周期
5,6,7,8, // 然后 4 5 6 7 8 为同周期 但判别4是否是新ID依旧困难
8, 1, 2,3
]
这种情况就完蛋了没法算了 大概不该这样 否则那个原程序也出现设计问题了
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
附带一个问题:
如何使dict的输出 按照其内容添加顺序输出
比如:
dict = {}
list = range(8)
list.reverse()
for i in list:
dict[i] = 1
print dict
=================
实际的输出: 0:1 1:1 ..........7:1
希望的输出: 7:1 6:1 5:1.....0:1 如何做到这一点
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
Python2.4:
for key in sorted(adict.keys):
print '%s: %s' % (key, adict[key])
|
|
----
|
|
[Original]
[Print]
[Top]
|
|