如何判断列表中的项目何时在 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
这感觉像是我正在尝试做的一个相当简单的概念。
举个例子:
假设我有一个列表[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