使用唯一 ID 对有效负载进行排序

Sort Payload with unique IDs

我有以下代码:

values = defaultdict(set)
for block in scanner:
    payload = block.packet_payload_info[2]
    id, type = getId(payload)
    values[id].add(value)
    out.write(str(id) + ";" + str(typee) + ";".join(map(str, [id] + list(values[id].round(2)))) + "\n")

我以下面的输出为例:

9;2;17.7999992370605479;17.299999237060547;17.799999237060547 10;2;22.39999961853027310;22.399999618530273 2;2;39.09999847412109411;20.399999618530273

现在发生了,有效负载再次读取值并再次打印相同的 id 并一次又一次地打印值。

9;2;17.7999992370605479;17.299999237060547;17.799999237060547
10;2;22.39999961853027310;22.399999618530273 
2;2;39.09999847412109411;20.399999618530273
[...]
9;2;17.7999992370605479;17.299999237060547;17.799999237060547
10;2;22.39999961853027310;22.399999618530273 
2;2;39.09999847412109411;20.399999618530273

我现在需要一个代码,其中只有唯一 ID 和之后的值,没有重复 ID。有人可以帮我在 python 中怎么做吗?

我认为您可以做的最简单的事情是存储现有 ID,并且仅在尚未处理 ID 时才继续。不过,这段代码仍应改进。有几件事很突出,其中之一是使用内置变量名 - id。你永远不应该这样做,就像你永远不应该将变量命名为 strlist 一样。您应该考虑的其他改进是向您的代码添加注释并坚持 PEP8 推荐的行长度。我还建议使用 f-strings 而不是 +ing strings to each other (see example).

下面是我解决您提到的确切问题的提议,请记住,我不了解您的代码到底在做什么以及您正在处理什么样的对象。

values = defaultdict(set)
ids_handled = []
for block in scanner:
    payload = block.packet_payload_info[2]
    item_id, type = getId(payload)
    if item_id not in ids_handled:
        values[item_id].add(value)
        out.write(str(id) + ";" + str(typee) + ";".join(map(str, [item_id] + list(values[item_id].round(2)))) + "\n")
        ids_handled.append(item_id)