检查列表中哪一项已更改的Python脚本?

检查列表中哪一项已更改的Python脚本?,python,list,Python,List,我有一个代码,我比较2个列表,然后告诉用户,项目的索引已更改,以及更改值是什么。下面是代码 default_io = [1, 1, 1, 1, 1, 1] while True: lst = [] n = int(input("Enter number of elements : ")) for i in range(0, n): ele = int(input()) lst.append(ele) # adding

我有一个代码,我比较2个列表,然后告诉用户,项目的索引已更改,以及更改值是什么。下面是代码

default_io = [1, 1, 1, 1, 1, 1]

while True:
    lst = []
    n = int(input("Enter number of elements : "))
    for i in range(0, n):
        ele = int(input())
        lst.append(ele)  # adding the element

    new_list = list(set(lst).difference(default_io))
    print(new_list)
    if new_list:
        print("io{}".format(lst.index(new_list[0])+1))
    else:
        print("no change")

    default_io = lst
最初,我使用一个默认的io列表,它将第一次与用户输入的列表进行比较。在第二次期间,我们必须将用户第一次输入的列表与他现在将输入的列表进行比较,并且它将继续进行

所以,我第一次输入了列表[1,1,1,1,0,1],如果我们将其与默认值[1,1,1,1,1,1]进行比较,我们可以看到第5个元素从1变为0。运行代码也会显示相同的输出:

Enter number of elements : 6
1
1
1
1
0
1
[0]
io5
但在第二次输入时,我输入了列表[1,1,1,1,1,1],理想情况下应与我之前输入的列表进行比较,即[1,1,1,0,1],输出应为第五个元素已从0更改为1,但输出为:

Enter number of elements : 6
1
1
1
1
1
1
[]
no change
我不明白为什么它显示错误的输出。我需要比较列表并预测哪个索引元素发生了变化。请帮忙。谢谢

  • 让我们从基础开始。Take
    setA={1,2,3}
    setB={2,3,4}
    setA-setB
    将返回
    setA
    setB
    中的所有值。在这种情况下,它将返回
    1
    ,因为
    1
    存在于
    setA
    中,而不是
    setB

  • 现在让我们看看
    setB setA
    将返回什么,正如您可能已经猜到的,它将返回4,因为4出现在
    setB
    中,而不是
    setA
    中。这里需要注意的一点是
    setA setB
    !=<代码>setB setA

  • 现在来看你们的节目。最初您的列表是
    default\u io=[1,1,1,1,1]
    ,现在您将一些值添加到临时列表
    lst=[1,1,1,0,1]
    。根据您实现的逻辑设置(lst)。差异(默认io)将返回
    0
    ,因为它存在于
    lst
    中,而不存在于
    默认io

  • 在第二次迭代中,您的
    default\u io=[1,1,1,1,0,1]
    lst=[1,1,1,1]
    set(lst)。差异(default\u io)
    将为您提供空集,因为
    default\u io
    包含
    1
    ,而
    set(default\u io)。差异(lst)
    将为您提供预期的结果

因此,理想的解决方案可能是(您可以明显改进):

new_list=[[x,index]表示枚举(itertools.zip_longest(lst,default_io))中的索引(x,y),如果x!=y]
这将为您提供正确的索引和已更改的值


为什么我建议反对使用
set
set.symmetric\u difference
作为您的问题解决方案

例如,让我们采用
default\u io=[2,3,1,1,1]
并输入
lst=[2,2,3,1,0,1]

现在让我们使用
set.symmetric\u difference
作为答案

set([2,3,1,1,1,1])。对称_差([2,2,3,1,0,1])
输出:

{0}
而第一个差异应该是
2
,因为
2
首先发生了变化

那么为什么会发生这种情况呢。让我们研究一下:

当您将列表传递到集合中时,它会删除重复项

所以这里
集合([2,3,1,1,1,1,1])
变成
{1,2,3}
集合([2,2,3,1,0,1])
变成
{0,1,2,3}

正如我们所知,set difference返回的值要么在
setA
中,要么在
setB
中,但不在它们的交点中,因此在这种情况下,它返回的
0
不是您期望的输出

另一种可能不起作用的情况:

set1=[2,3,1,1,1,1]
set2=[2,2,3,1,1,1]
#op:set()

简单地说,如果要减去2组,值为零的索引意味着每个列表的索引处都有相同的值。如果它的值不是0,则表示该索引发生了更改。

在第二次迭代中,您的代码基本上是在计算:

set([1, 1, 1, 1, 1, 1]).difference([1, 1, 1, 1, 0, 1])
这相当于:

{1}.difference([1, 1, 1, 1, 0, 1])
其结果是一个空集:

set()
为什么它返回一个空集?因为该方法的工作原理如下:

返回一个新的集合,其中集合中的元素不在指定的iterables中

具体地说,该集合包含值1,并且仅包含值1,该值确实在iterable列表中,因此结果是一个空集。0也出现在iterable中这一事实与差分方法无关

相反,您应该使用,它:

返回一个新的集合,其中包含集合或指定的iterable中的元素,但不能同时包含这两个元素

例如:

set([1, 1, 1, 1, 1, 1]).symmetric_difference([1, 1, 1, 1, 0, 1])
# result is {0}

请参阅@jarmod抱歉,我无法理解。
set([1, 1, 1, 1, 1, 1]).symmetric_difference([1, 1, 1, 1, 0, 1])
# result is {0}