我有一个代码,我在其中比较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]
它为您提供了正确的索引和更改后的值。
为什么我建议不要使用set
或set.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返回的值在setA
或setB
中,但不在它们的交集中,因此在这种情况下,它返回的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}