Python 如何有选择地附加列表?

Python 如何有选择地附加列表?,python,if-statement,for-loop,rfid,Python,If Statement,For Loop,Rfid,我通过RFID阅读器接收信息。我试图做的是删除重复项,并仅在以下两个条件下附加到列表: 如果他们的ID(epc在本例中)是唯一的,并且(完成) datetime在间隔5分钟之后(因此我可以跟踪RFID阅读器每5分钟仍在读取的相同标签) 我怎样才能达到条件2 更新 我为我试图实现的目标不明确而道歉 我期望的输出如下所示: {'datetime': 2016-04-06 03:21:17', 'epc': 00000001} # from Tag A {'datetime': 2016-04-06

我通过RFID阅读器接收信息。我试图做的是删除重复项,并仅在以下两个条件下附加到列表:

  • 如果他们的ID(
    epc
    在本例中)是唯一的,并且(完成)
  • datetime
    在间隔5分钟之后(因此我可以跟踪RFID阅读器每5分钟仍在读取的相同标签)

  • 我怎样才能达到条件2

    更新
    我为我试图实现的目标不明确而道歉

    我期望的输出如下所示:

    {'datetime': 2016-04-06 03:21:17', 'epc': 00000001} # from Tag A
    {'datetime': 2016-04-06 03:21:18', 'epc': 00000002} # from Tag B
    ...
    ...
    # 5 minutes later
    {'datetime': 2016-04-06 03:21:17', 'epc': 00000001} # from Tag A
    {'datetime': 2016-04-06 03:21:18', 'epc': 00000002} # from Tag B
    {'datetime': 2016-04-06 03:26:17', 'epc': 00000001} # from Tag A
    {'datetime': 2016-04-06 03:26:18', 'epc': 00000002} # from Tag B
    ...
    ...
    # Another 5 minutes later
    {'datetime': 2016-04-06 03:21:17', 'epc': 00000001} # from Tag A
    {'datetime': 2016-04-06 03:21:18', 'epc': 00000002} # from Tag B
    {'datetime': 2016-04-06 03:26:17', 'epc': 00000001} # from Tag A
    {'datetime': 2016-04-06 03:26:18', 'epc': 00000002} # from Tag B
    {'datetime': 2016-04-06 03:31:17', 'epc': 00000001} # from Tag A
    {'datetime': 2016-04-06 03:31:18', 'epc': 00000002} # from Tag B
    ...
    ...
    

    这可能是一种更简单的方法:

    class EPC(object):
        def __init__(self, epc, date):
            self.epc = epc
            self.datetime = date
        def __eq__(self, other):
            difference = datetime.strptime(self.datetime, '%Y-%m-%d %H:%M:%S') - datetime.strptime(other.datetime, '%Y-%m-%d %H:%M:%S')
            return self.epc == other.epc and timedelta(minutes=-5) < difference < timedelta(minutes=5)
        def __ne__(self, other):
            difference = datetime.strptime(self.datetime, '%Y-%m-%d %H:%M:%S') - datetime.strptime(other.datetime, '%Y-%m-%d %H:%M:%S')
            return self.epc != other.epc or (self.epc == other.epc and (difference > timedelta(minutes=5) or difference < timedelta(minutes=-5))) 
    
    payload = EPC(date, epc[11:35])
    if payload not in test_list:
        test_list.append(payload)
    
    类EPC(对象):
    定义初始日期(自我、epc、日期):
    self.epc=epc
    self.datetime=日期
    定义(自身、其他):
    差异=datetime.strtime(self.datetime,%Y-%m-%d%H:%m:%S')-datetime.strtime(other.datetime,%Y-%m-%d%H:%m:%S'))
    返回self.epc==other.epc和timedelta(分钟=-5)时间增量(分钟=5)或差异<时间增量(分钟=-5)))
    有效载荷=EPC(日期,EPC[11:35])
    如果有效载荷不在测试列表中:
    测试列表追加(有效负载)
    
    这可能是一种更简单的方法:

    class EPC(object):
        def __init__(self, epc, date):
            self.epc = epc
            self.datetime = date
        def __eq__(self, other):
            difference = datetime.strptime(self.datetime, '%Y-%m-%d %H:%M:%S') - datetime.strptime(other.datetime, '%Y-%m-%d %H:%M:%S')
            return self.epc == other.epc and timedelta(minutes=-5) < difference < timedelta(minutes=5)
        def __ne__(self, other):
            difference = datetime.strptime(self.datetime, '%Y-%m-%d %H:%M:%S') - datetime.strptime(other.datetime, '%Y-%m-%d %H:%M:%S')
            return self.epc != other.epc or (self.epc == other.epc and (difference > timedelta(minutes=5) or difference < timedelta(minutes=-5))) 
    
    payload = EPC(date, epc[11:35])
    if payload not in test_list:
        test_list.append(payload)
    
    类EPC(对象):
    定义初始日期(自我、epc、日期):
    self.epc=epc
    self.datetime=日期
    定义(自身、其他):
    差异=datetime.strtime(self.datetime,%Y-%m-%d%H:%m:%S')-datetime.strtime(other.datetime,%Y-%m-%d%H:%m:%S'))
    返回self.epc==other.epc和timedelta(分钟=-5)时间增量(分钟=5)或差异<时间增量(分钟=-5)))
    有效载荷=EPC(日期,EPC[11:35])
    如果有效载荷不在测试列表中:
    测试列表追加(有效负载)
    
    我想知道
    epc
    值是否可以前后交替。也就是说,是否可能出现epc值“A”,然后出现epc值“B”,然后再次出现epc值“A”?(或可能是A、B、C等?)

    如果假设只有一个标记,那么只需查看最近的条目:

    last_tag = testlist[-1]
    last_dt = last_tag['datetime']
    
    现在,您可以将当前的
    datetime
    值与以前的值进行比较,看看它是否适合您的窗口


    不过,请注意,将datetime代码放入has实际上对您现有的代码不起作用,因为datetime一直在变化,因此不在testlist中的负载将始终为真,除非您在同一秒获得两次RFID读取。

    我不得不怀疑
    epc
    值是否可以前后交替。也就是说,是否可能出现epc值“A”,然后出现epc值“B”,然后再次出现epc值“A”?(或可能是A、B、C等?)

    如果假设只有一个标记,那么只需查看最近的条目:

    last_tag = testlist[-1]
    last_dt = last_tag['datetime']
    
    现在,您可以将当前的
    datetime
    值与以前的值进行比较,看看它是否适合您的窗口


    但是,请注意,将datetime代码放入has实际上对您现有的代码不起作用,因为datetime一直在变化,因此不在testlist中的负载将始终为真,除非您在同一秒钟内获得两次RFID读取。

    有几点可以解决您的问题:

  • 对于ID唯一性,您只需要检查
    epc
    字段,而不是整个
    有效载荷
    对象,因为
    有效载荷
    对象包括
    日期时间
    。您可以使用
    集合
    存储所有可见的ID
  • 要检查时间,请使用
    datetime
    timedelta
    对象来比较时间
  • #-*-编码:utf-8-*-
    """
    2016年4月6日
    答http://stackoverflow.com/questions/36440618/
    """
    #导入语句
    #将paho.mqtt.client作为mqtt导入
    导入json
    将日期时间导入为dt
    testlist=[]
    seen_id=set()#seen id的集合
    五分钟=dt.timedelta(分钟=5)#五分钟的差异
    def on_消息(客户端、用户数据、消息):
    payloadjson=json.loads(msg.payload.decode('utf-8'))
    line=payloadjson[“value”]。拆分(“,”)
    epc=第[1]行
    datetime=payloadjson['datetime']
    #datetime采用此字符串格式“2016-04-06 03:21:17”
    #将字符串转换为datetime对象
    datetime=dt.datetime.strtime(datetime,%Y-%m-%d%H:%m:%S')
    有效负载={'datetime':datetime,'epc':epc[11:35]}
    #此if语句满足条件1
    如果有效负载['epc']不在可见的ID中:#需要使用另一组
    是否应该添加=真#是否添加的标志
    如果len(testlist)>0:
    最后有效载荷=测试列表[-1]
    diff=有效载荷['datetime']-最后一次有效载荷['datetime']
    如果差异小于五分钟:#如果较新的差异小于五分钟,则不要添加
    是否应该添加=False
    如果应添加:
    所见_id.add(有效载荷['epc'])#标记为所见
    追加(有效负载)
    打印('现在测试列表的内容:')
    对于testlist中的每一项:
    打印(每个)
    类消息(对象):
    定义初始化(自身,有效载荷):
    self.payload=有效载荷
    def main():
    测试用例=[]
    对于范围(10)内的i:
    有效载荷=“{value:”,{}”,“datetime:“2016-04-06 03:{:02d}:17}}”。格式('0'*34+str(i),i)
    测试用例=消息(有效负载)
    测试用例。追加(测试用例)
    对于测试用例中的测试用例:
    on_消息(无、无、测试_案例)
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    main()
    
    将打印:

    Content of testlist now: {'epc': u'000000000000000000000000', 'datetime': datetime.datetime(2016, 4, 6, 3, 0, 17)} Content of testlist now: {'epc': u'000000000000000000000000', 'datetime': datetime.datetime(2016, 4, 6, 3, 0, 17)} {'epc': u'000000000000000000000005', 'datetime': datetime.datetime(2016, 4, 6, 3, 5, 17)} 现在测试列表的内容: {'
    import paho.mqtt.client as mqtt
    import json
    import datetime as dt
    
    TIMELIMIT = dt.timedelta(minutes=5)
    
    testlist = {}       ## <<-- changed this to a dict()
    
    def on_message(client, userdata, msg):
        payloadjson = json.loads(msg.payload.decode('utf-8'))
        line = payloadjson["value"].split(',')
        epc =  line[1]
    
        # this converts the time stamp string to something python can
        # use in date / time calculations
        when = dt.datetime.strptime(payloadjson['datetime'], '%Y-%m-%d %H:%M:%S')
    
        if epc not in testlist or when - testlist[epc] > TIMELIMIT:
            testlist[epc] = when
    
            for epc, when in teslist.items():
                print (epc, when)