如何判断列表中的项目在Python中的位置何时发生了变化
这感觉像是我正在尝试的一个相当简单的概念 举个例子: 假设我有一个列表如何判断列表中的项目在Python中的位置何时发生了变化,python,python-2.x,Python,Python 2.x,这感觉像是我正在尝试的一个相当简单的概念 举个例子: 假设我有一个列表[1,2,3,4] 更改为[2,3,4,1] 我需要能够识别更改,以便在不更新整个列表的情况下用JSON表示和更新数据 背景-这是在MIDI中使用的,实际列表可能比这个长很多,JSON可以以不同的复杂度嵌套。一次发生的变化也可能不止一个。由于时间复杂性,不可能更新整个JSON或嵌套列表。我现在是这样做的,但为了扩展,我需要能够识别什么时候发生了特定的变化,并有一些方法来表示这一点。它需要在Python2中实现,而不需要任何外部
[1,2,3,4]
更改为[2,3,4,1]
我需要能够识别更改,以便在不更新整个列表的情况下用JSON表示和更新数据
背景-这是在MIDI中使用的,实际列表可能比这个长很多,JSON可以以不同的复杂度嵌套。一次发生的变化也可能不止一个。由于时间复杂性,不可能更新整个JSON或嵌套列表。我现在是这样做的,但为了扩展,我需要能够识别什么时候发生了特定的变化,并有一些方法来表示这一点。它需要在Python2中实现,而不需要任何外部包,因为它正在嵌入DAW(Ableton Live)中的Python安装中使用
有人知道有什么可以帮助解决这个问题吗?任何帮助或阅读材料都将不胜感激
编辑:
我尝试在两个列表上循环并比较值,但这会检测到所有值的变化,这并不比重新发送整个列表快,可能会慢得多,因为我先有两个嵌套的for循环,然后仍然通过MIDI发送整个列表。例如,制作一个跟踪其变化的类如何
#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]
>>>
这使得创建容器类变得很容易,并且您可以免费获得一系列方法,在这种情况下,这些方法是可变序列的:
append
,reverse
,extend
,pop
,remove
,包含,,,,,,,,反向,和count
例如,创建一个跟踪其更改的类
#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]
>>>
这使得创建容器类变得很容易,并且您可以免费获得一系列方法,在这种情况下,这些方法是可变序列的:append
,reverse
,extend
,pop
,remove
,包含,,,,,,,,反向,和count
它的变化是什么意思?它是如何变化的?例如,它是一个就地操作还是创建了一个新的、不同的列表?它在Ableton Live API内部发生了变化。这是一个就地操作,但我能够在最终覆盖之前存储旧列表以进行比较。保留一个用值初始化的字典
:“index”,并对照该值检查索引是否已更改请不要将解决方案公告编辑为问题。请创建一个答案。好的,我编辑的不是一个解决方案,只是我现在看到的。在这种情况下不起作用,因为所有指数都是通过沿一个方向移动而改变的。我认为字典可能是一种方法,但问题是我把这些项目列为一个列表。你说它变了是什么意思?它是如何变化的?例如,它是一个就地操作还是创建了一个新的、不同的列表?它在Ableton Live API内部发生了变化。这是一个就地操作,但我能够在最终覆盖之前存储旧列表以进行比较。保留一个用值初始化的字典
:“index”,并对照该值检查索引是否已更改请不要将解决方案公告编辑为问题。请创建一个答案。好的,我编辑的不是一个解决方案,只是我现在看到的。在这种情况下不起作用,因为所有指数都是通过沿一个方向移动而改变的。我认为字典可能是一种方式,但问题是我得到的项目作为一个列表。