我从不同设备的传输中收到ID。我将这些ID放入列表中一段时间。填充列表很容易,但我想设置一个计时器,如果其中一个发送器停止发送一段时间x,我想从列表中删除该ID。
要构建此列表,我有:
tags_list = []
while True:
#######################################################################################
#FOR CHECK IN THREAD
#######################################################################################
readable, writable, exceptional = select.select([sock], [], [], 1.0)
if readable:
data = sock.recv(1024)
tag_address = ':'.join('%02x' % ord(c) for c in data[12:6:-1])
if len(data) == 41:
if tag_address in valid_tags:
if len(tags_list) > 0:
if tag_address not in wander_tags:
tags_list.append(tag_address)
else:
print "ERROR"
但我无法想出一种方法,可以在未收到ID时从列表中有效删除ID。有任何想法吗? tag_address的格式为xx:xx:xx:xx:xx:xx
已删除"列表"作为名单的名称。
答案 0 :(得分:2)
在没有看到代码的其余部分的情况下,我可以说你需要跟踪某个地方的最后一次传输时间/ ID,复制list
(删除表格的好主意)您当前正在迭代的序列),不包括time_now - last_transmission_time > timeout_value
的所有元素,然后将list
替换为副本。
类似于:
def clean_list(lst):
return [ele for ele in lst if ele.last_transmission - time_now < timeout_value]
while True:
ID = data[1:4]
if ID not in id_list:
id_list.append(ID)
id_list = clean_list(id_list)
我使用点符号表示清晰度和易用性,但您必须使其适用于您的设置。
答案 1 :(得分:2)
我会用dict。
import time
transmitted_IDs = {}
while True:
to_delete = []
ID = data[1:4]
if ID not in transmitted_IDs:
transmitted_IDs[ID] = time.time()
for ID, time_taken in transmitted_IDs.iteritems():
## Iterating over a dict, we get key, value pairs
## So here time_taken is transmitted_IDs[ID]
if time.time() - time_taken >= x:
to_delete.append[ID]
for ID in to_delete:
del transmitted_IDs[ID]
您现在可以使用transmitted_IDs.keys()
代替您在代码中其他位置使用list
的位置。