Python列表填充,并在while循环中删除项目

时间:2014-08-05 16:15:17

标签: python list

我从不同设备的传输中收到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

已删除"列表"作为名单的名称。

2 个答案:

答案 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的位置。

相关问题