如何判断列表中的项目何时在 Python 中改变了位置

How to tell when an item in a list has changed position in Python

这感觉像是我正在尝试做的一个相当简单的概念。

举个例子:

假设我有一个列表[1, 2, 3, 4]

那变成了[2, 3, 4, 1]

我需要能够识别更改,以便我可以在 JSON 中表示和更新数据,而无需更新整个列表。

一些背景知识 - 这是用于 MIDI,实际列表可能比这长很多,并且 JSON 可以嵌套不同的复杂性。也可能同时发生不止一个变化。由于时间复杂性,不可能更新整个 JSON 或嵌套列表。我目前正在这样做,但为了扩展,我需要能够确定特定更改何时发生,并以某种方式表示这一点。它需要在 Python 2 中可用,无需任何外部包,因为它被用于嵌入在 DAW (Ableton Live) 中的 Python 安装中。

有谁知道有什么可以帮助解决这个问题的吗?任何帮助或阅读 material 将不胜感激。

编辑:

我试过遍历两个列表并比较值,但这检测到它是所有值的变化,这并不比重新发送整个列表快,可能慢得多,因为我有两个嵌套的 for 循环首先 THEN 仍然通过 MIDI 发送整个列表。

怎么样,做一个class来跟踪它的变化,例如

#from collections.abc import MutableSequence #this for python 3.3+
from collections import MutableSequence

class TrackingList(MutableSequence):
    """list that track its changes"""

    def __init__(self,iterable=()):
        self.data = list(iterable)
        self.changes =[]

    def __len__(self):
        return len(self.data)

    def __getitem__(self,index):
        return self.data[index]

    def __setitem__(self,index,value):
        self.data[index]=value
        self.changes.append(("set",index,value))

    def __delitem__(self,index):
        del self.data[index]
        self.changes.append(("del",index))

    def insert(self,index,value):
        self.data.insert(index,value)
        self.changes.append(("insert",index,value))

    def __str__(self):
        return str(self.data)
        

使用示例

>>> tl=TrackingList([1,2,3,4])
>>> print(tl)
[1, 2, 3, 4]
>>> tl.changes
[]
>>> tl[0],tl[-1] = tl[-1],tl[0]
>>> print(tl)
[4, 2, 3, 1]
>>> tl.changes
[('set', 0, 4), ('set', -1, 1)]
>>> tl.append(32)
>>> tl.changes
[('set', 0, 4), ('set', -1, 1), ('insert', 4, 32)]
>>> print(tl)
[4, 2, 3, 1, 32]
>>> 

collections.abc 使制作容器变得容易 classes 并且你免费获得了一堆方法,在 MutableSequence 的情况下是:append, reverse, extend, pop, remove, __iadd__, __contains__, __iter__, __reversed__, index,和 count