Python 比较 2 个包含 3 元组的列表
Python compare 2 lists filled with 3-tuples
我有 2 个列表,每个列表都填充了 3 元组。
一开始它们是相等的:
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
案例一:
在b
末尾添加了一个额外的元素
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,124),(2,1,231),(2,2,123),(3,1,123)]
Return: Added (3,1,123)
案例二
b
中的元素 2 从 124
-> 123
更改
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,123),(2,1,231),(2,2,123)]
Return: Changed a[1] to (1,2,123)
案例三
情况1和2的组合,b
中添加了一个额外的元素,b
中的元素2从124
-> 123
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,123),(2,1,231),(2,2,123),(3,1,123)]
Return: Added (3,1,123) and Changed a[1] to (1,2,123)
在所有情况下 a==b
returns 错误,我想做的是弄清楚如何比较列表并确定元素是否被添加、更改或两者兼而有之。寻找任何建议。
你可以比较if len(b) > len(b)
来检查是否添加了一个元素,如果False
,然后比较是否a==b
。
if len(b) > len(a):
if b[:len(a)] == a:
print 'Added only'
else:
print 'Added and changed'
else:
if b != a:
print 'Changed'
else:
print 'No changes'
changed = False
added = len(tuple1) != len(tuple2)
for e1, e2 in zip(tuple1, tuple2):
if e1 != e2:
changed = True
return changed, added, a==b
这是编辑之前的。这将检查是否添加、更改或相同,并相应地 return 三个布尔值。
tuple1 = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
tuple2 = [(1,1,123),(1,2,124),(2,1,231),(2,2,13), (0,0)]
changed = False
info = ""
if len(tuple1) != len(tuple2):
info += "Added " + str(tuple2[-1])
for e1, e2 in zip(tuple1, tuple2):
if e1 != e2:
info += " Changed a[" + str(tuple2.index(e2)) + "] to " + str(e2)
print(info)
打印 ---> "Added (0, 0) Changed a[3] to (2, 2, 13)"
上面的代码是 post 编辑的,并且在仅添加一个元素并将该元素添加到第二个元组或 "b".
的任何情况下都有效
列表是一个mutable sequence,当比较列表时,它实际上不会比较它的内容。
但是,元组是不可变的。比较元组会给你预期的行为。
tuple(a) == tuple(b)
这是一个简单的方法来测试是否 a == b。
added = len(b) > len(a)
changed = b[:len(a)] != a
both = added and changed
我有 2 个列表,每个列表都填充了 3 元组。
一开始它们是相等的:
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
案例一:
在b
末尾添加了一个额外的元素
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,124),(2,1,231),(2,2,123),(3,1,123)]
Return: Added (3,1,123)
案例二
b
中的元素 2 从 124
-> 123
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,123),(2,1,231),(2,2,123)]
Return: Changed a[1] to (1,2,123)
案例三
情况1和2的组合,b
中添加了一个额外的元素,b
中的元素2从124
-> 123
a = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
b = [(1,1,123),(1,2,123),(2,1,231),(2,2,123),(3,1,123)]
Return: Added (3,1,123) and Changed a[1] to (1,2,123)
在所有情况下 a==b
returns 错误,我想做的是弄清楚如何比较列表并确定元素是否被添加、更改或两者兼而有之。寻找任何建议。
你可以比较if len(b) > len(b)
来检查是否添加了一个元素,如果False
,然后比较是否a==b
。
if len(b) > len(a):
if b[:len(a)] == a:
print 'Added only'
else:
print 'Added and changed'
else:
if b != a:
print 'Changed'
else:
print 'No changes'
changed = False
added = len(tuple1) != len(tuple2)
for e1, e2 in zip(tuple1, tuple2):
if e1 != e2:
changed = True
return changed, added, a==b
这是编辑之前的。这将检查是否添加、更改或相同,并相应地 return 三个布尔值。
tuple1 = [(1,1,123),(1,2,124),(2,1,231),(2,2,123)]
tuple2 = [(1,1,123),(1,2,124),(2,1,231),(2,2,13), (0,0)]
changed = False
info = ""
if len(tuple1) != len(tuple2):
info += "Added " + str(tuple2[-1])
for e1, e2 in zip(tuple1, tuple2):
if e1 != e2:
info += " Changed a[" + str(tuple2.index(e2)) + "] to " + str(e2)
print(info)
打印 ---> "Added (0, 0) Changed a[3] to (2, 2, 13)"
上面的代码是 post 编辑的,并且在仅添加一个元素并将该元素添加到第二个元组或 "b".
的任何情况下都有效列表是一个mutable sequence,当比较列表时,它实际上不会比较它的内容。
但是,元组是不可变的。比较元组会给你预期的行为。
tuple(a) == tuple(b)
这是一个简单的方法来测试是否 a == b。
added = len(b) > len(a)
changed = b[:len(a)] != a
both = added and changed