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



我有一个代码,我在其中比较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

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

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

Enter number of elements : 6
1
1
1
1
0
1
[0]
io5

但在第二次期间,我输入了列表[1,1,1,1,2,1],理想情况下,该列表应与我之前输入的列表进行比较,即[1,1,1,1,0,1],输出应为第五个元素已从0变为1,但输出为:

Enter number of elements : 6
1
1
1
1
1
1
[]
no change

我不明白为什么它显示错误的输出。我需要比较列表并预测哪个索引元素发生了变化。请帮忙。感谢

  • 让我们从基础知识开始。取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_io = [1, 1, 1, 1, 1, 1],现在您将一些值添加到临时列表lst=[1, 1, 1, 1, 0, 1]中。根据您实现的逻辑,set(lst).difference(default_io)将返回0,因为它在lst中存在,而在default_io中不存在。

  • 在第二次迭代中,default_io=[1, 1, 1, 1, 0, 1]lst=[1, 1, 1, 1, 1, 1]set(lst).difference(default_io)将给您空集,因为default_io包含1,而set(default_io).difference(lst)将给您预期的结果。

所以一个理想的解决方案可能是(你可以明显改进(:

new_list = [[x, index] for index, (x, y) in enumerate(itertools.zip_longest(lst, default_io)) if x!=y]

它为您提供了正确的索引和更改后的值。


为什么我建议不要使用setset.symmetric_difference作为解决您问题的答案。

例如,让我们取default_io=[2, 3, 1, 1, 1, 1],然后输入lst=[2, 2, 3, 1, 0, 1]

现在让我们使用set.symmetric_difference作为建议的答案。

set([2, 3, 1, 1, 1, 1]).symmetric_difference([2, 2, 3, 1, 0, 1])

输出:

{0}

而第一差值应该是CCD_ 32,因为CCD_。

那么为什么会发生这种情况呢。让我们来看看:

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

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

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

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

set1=[2, 3, 1, 1, 1, 1]
set2=[2, 2, 3, 1, 1, 1]
# op: set() <-- empty
import numpy
default_io = numpy.array([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
lst = numpy.array(lst)
new_list = default_io - lst
if list(new_list) == [0,0,0,0,0,0]:
print("no change")
else:
li = []
for i in new_list:
if i != 0:
li.append(list(new_list).index(i))
print(li)
print("change")
default_io = lst

简单地说,如果你要减去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()

为什么它返回一个空集?因为set.difference(可迭代(方法的工作原理如下:

返回一个新集合,该集合中的元素不在指定的可迭代项中。

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

相反,您应该使用symmetric_difference,即:

返回一个新集合,该集合或指定的可迭代对象中包含元素,但不能同时包含这两个元素。

例如:

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

最新更新