检查列表中哪一项已更改的Python脚本?
我有一个代码,我比较2个列表,然后告诉用户,项目的索引已更改,以及更改值是什么。下面是代码检查列表中哪一项已更改的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
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
- 现在让我们看看
将返回什么,正如您可能已经猜到的,它将返回4,因为4出现在setB setA
中,而不是setB
中。这里需要注意的一点是setA
!=<代码>setB setAsetA setB
- 现在来看你们的节目。最初您的列表是
,现在您将一些值添加到临时列表default\u io=[1,1,1,1,1]
。根据您实现的逻辑设置(lst)。差异(默认io)将返回lst=[1,1,1,0,1]
,因为它存在于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}