如何将唯一的传入消息附加到列表中?
How to append unique incoming messages to a list?
我正在使用 RFID reader 来接收消息。我试图通过将它们附加到 emptylist = []
来避免重复消息,并且如果它们存在于列表中则不再附加它们。以下是我的代码:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
client.subscribe("/whatver/#")
def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server
payloadjson = json.loads(msg.payload.decode('utf-8'))
line = payloadjson["value"].split(',')
epc = line[1]
payload = {'a': epc[11:35], 'b':payloadjson["devicename"], 'c':payloadjson["sensorname"]}
emptylist = []
emptylist.append(payload)
if payload not in emptylist:
emptylist.append(payload)
print (emptylist)
test = mqtt.Client(protocol = mqtt.MQTTv31)
test.connect(host=_host, port=1883, keepalive=60, bind_address="")
test.on_connect = on_connect
test.on_message = on_message
test.loop_forever()
但是我得到如下输出,这表明 payload
附加到 emptylist
,但存储在多个单独的列表中。如果 RFID reader 仍在读取相同的标签,它会继续打印相同的输出。我想删除重复的消息并只保留一条消息,即使 RFID reader 读取相同的标签。
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': 'abcxxx000000130000627000'}] # from Tag B
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A
.
.
.
我该如何解决这个问题?
您可以在追加时检查是否存在,如下所示:
if payload not in emptylist:
emptylist.append(payload)
或
您可以在最终输出中选择 set(emptylist)
。
如其他答案所述,集合是避免存储或打印重复项的好方法。您 可以 使用列表执行此操作(效率较低),但是,您当前代码中的逻辑不正确。每次调用 on_message
时,它都会创建一个新的空 emptylist
,然后将新的 payload
附加到它,因此下面的 if payload not in emptylist:
没有多大意义。
您需要在 on_message
回调之外初始化 emptylist
。例如,
emptylist = []
def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server
payloadjson = json.loads(msg.payload.decode('utf-8'))
line = payloadjson["value"].split(',')
epc = line[1]
payload = {
'a': epc[11:35],
'b':payloadjson["devicename"],
'c':payloadjson["sensorname"],
}
if payload not in emptylist:
emptylist.append(payload)
print (emptylist)
如果 emptylist
.
中没有新的有效载荷,那只会附加并打印新的有效载荷
要使用集合做同样的事情:
emptylist = set()
def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server
payloadjson = json.loads(msg.payload.decode('utf-8'))
line = payloadjson["value"].split(',')
epc = line[1]
payload = {
'a': epc[11:35],
'b':payloadjson["devicename"],
'c':payloadjson["sensorname"],
}
if payload not in emptylist:
emptylist.add(payload)
print (emptylist)
FWIW,emptylist
是一个有点令人困惑的变量名。 :)
我正在使用 RFID reader 来接收消息。我试图通过将它们附加到 emptylist = []
来避免重复消息,并且如果它们存在于列表中则不再附加它们。以下是我的代码:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
client.subscribe("/whatver/#")
def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server
payloadjson = json.loads(msg.payload.decode('utf-8'))
line = payloadjson["value"].split(',')
epc = line[1]
payload = {'a': epc[11:35], 'b':payloadjson["devicename"], 'c':payloadjson["sensorname"]}
emptylist = []
emptylist.append(payload)
if payload not in emptylist:
emptylist.append(payload)
print (emptylist)
test = mqtt.Client(protocol = mqtt.MQTTv31)
test.connect(host=_host, port=1883, keepalive=60, bind_address="")
test.on_connect = on_connect
test.on_message = on_message
test.loop_forever()
但是我得到如下输出,这表明 payload
附加到 emptylist
,但存储在多个单独的列表中。如果 RFID reader 仍在读取相同的标签,它会继续打印相同的输出。我想删除重复的消息并只保留一条消息,即使 RFID reader 读取相同的标签。
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': 'abcxxx000000130000627000'}] # from Tag B
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A
[{'b': 'READERBASIN.3', 'c': 'ANTENNA.2', 'a': '000000000000130000624462'}] # from Tag A
.
.
.
我该如何解决这个问题?
您可以在追加时检查是否存在,如下所示:
if payload not in emptylist:
emptylist.append(payload)
或
您可以在最终输出中选择 set(emptylist)
。
如其他答案所述,集合是避免存储或打印重复项的好方法。您 可以 使用列表执行此操作(效率较低),但是,您当前代码中的逻辑不正确。每次调用 on_message
时,它都会创建一个新的空 emptylist
,然后将新的 payload
附加到它,因此下面的 if payload not in emptylist:
没有多大意义。
您需要在 on_message
回调之外初始化 emptylist
。例如,
emptylist = []
def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server
payloadjson = json.loads(msg.payload.decode('utf-8'))
line = payloadjson["value"].split(',')
epc = line[1]
payload = {
'a': epc[11:35],
'b':payloadjson["devicename"],
'c':payloadjson["sensorname"],
}
if payload not in emptylist:
emptylist.append(payload)
print (emptylist)
如果 emptylist
.
要使用集合做同样的事情:
emptylist = set()
def on_message(client, userdata, msg): # when PUBLISH msg is rcvd frm the server
payloadjson = json.loads(msg.payload.decode('utf-8'))
line = payloadjson["value"].split(',')
epc = line[1]
payload = {
'a': epc[11:35],
'b':payloadjson["devicename"],
'c':payloadjson["sensorname"],
}
if payload not in emptylist:
emptylist.add(payload)
print (emptylist)
FWIW,emptylist
是一个有点令人困惑的变量名。 :)