Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何判断列表中的项目在Python中的位置何时发生了变化_Python_Python 2.x - Fatal编程技术网

如何判断列表中的项目在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”,并对照该值检查索引是否已更改请不要将解决方案公告编辑为问题。请创建一个答案。好的,我编辑的不是一个解决方案,只是我现在看到的。在这种情况下不起作用,因为所有指数都是通过沿一个方向移动而改变的。我认为字典可能是一种方式,但问题是我得到的项目作为一个列表。