python如何比较嵌套序列
所以我卷入了一些我不明白的事情。鉴于:python如何比较嵌套序列,python,python-2.7,nested,comparison,tuples,Python,Python 2.7,Nested,Comparison,Tuples,所以我卷入了一些我不明白的事情。鉴于: table # Type: tuple(tuple(str)). data # Type: list(list(str)). Both ordered by rows. 运行以下两个比较时,输出不同,我想知道第一个输出的原因: table == tuple(tuple(x for x in row) for row in data) -> False all(table[i] == tuple(data[i]) for i in xrange(
table # Type: tuple(tuple(str)).
data # Type: list(list(str)). Both ordered by rows.
运行以下两个比较时,输出不同,我想知道第一个输出的原因:
table == tuple(tuple(x for x in row) for row in data) -> False
all(table[i] == tuple(data[i]) for i in xrange(len(table))) -> True
==
如何处理嵌套序列和非嵌套序列
进行比较的数据:
data = [['A1', 'B1', 'C1', 'D1'], ['A2', 'B2', 'C2', 'D2'], ['A3', 'B3', 'C3', 'D3'], ['A4', 'B4', 'C4', 'D4'], ['1', '2', '3', '4'], ['11', '2', '3', '1'], ['1.1', '2.2', '3.3', '4.0'], ['11', '2', '3', '1'], ['Area', '', 'None', 'Area Error']]
table = (('A1', 'B1', 'C1', 'D1'), ('A2', 'B2', 'C2', 'D2'), ('A3', 'B3', 'C3', 'D3'), ('A4', 'B4', 'C4', 'D4'), ('1', '2', '3', '4'), ('11', '2', '3', '1'), ('1.1', '2.2', '3.3', '4.0'), ('11', '2', '3', '1'), ('Area', '', 'None', 'Area Error'))
解决方案
抱歉,我在互动提示中检查后发现了它<代码>表是另一个名为行
的对象的属性。我犯的错误是,我太习惯于传递出现索引和迭代器的行
(返回行.table
元素),我忘记了它的结构与table
不同。实际误差:
rows == tuple(tuple(x for x in row) for row in data) # Should be `rows.table`.
抱歉搞砸了但是比较问题仍然有效。您在all
行中缺少一个)
。当我添加缺少的参数时,我得到两行都返回true:
data = [['A1', 'B1', 'C1', 'D1'], ['A2', 'B2', 'C2', 'D2'], ['A3', 'B3', 'C3', 'D3'], ['A4', 'B4', 'C4', 'D4'], ['1', '2', '3', '4'], ['11', '2', '3', '1'], ['1.1', '2.2', '3.3', '4.0'], ['11', '2', '3', '1'], ['Area', '', 'None', 'Area Error']]
table = (('A1', 'B1', 'C1', 'D1'), ('A2', 'B2', 'C2', 'D2'), ('A3', 'B3', 'C3', 'D3'), ('A4', 'B4', 'C4', 'D4'), ('1', '2', '3', '4'), ('11', '2', '3', '1'), ('1.1', '2.2', '3.3', '4.0'), ('11', '2', '3', '1'), ('Area', '', 'None', 'Area Error'))
print table == tuple(tuple(x for x in row) for row in data) # True
print all(table[i] == tuple(data[i]) for i in xrange(len(table))) # True
问题:==如何适用于嵌套序列和非嵌套序列 比较,即
==
仅适用于文本,即int、string等。但是,当我们比较嵌套数据类型(如列表、列表列表
或嵌套级别较高的内容)时,例如字典列表,其中键为字符串,值为整数元组
,比较将以深度优先的方式在嵌套中存在的(literal,position on literal)
对上进行。下面是支持我的论点的示例代码:
注意,每个类都可以根据自己的需求重载=
方法
测试用例:
a= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"],2:{1:2, 2:3}}, (1,2),[(1, 2),{1:2}]]
b= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"],2:{1:2, 2:3}}, (1,2),[(1, 2),{1:2}]]
print(comp(a,b)) #True
a= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"], 5:4}, (1,2),[(1, 2),{1:2}]]
b= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"], 5:2}, (1,2),[(1, 2),{1:2}]]
print(comp(a,b)) #False
a=5
b="shasha"
print(comp(a,b)) #False
a=4
b=5
print(comp(a,b)) #False
您能否给出表的示例数据和我们实际可以运行的代码的数据,这实际上说明了运行时的问题。你发布的
all
版本应该给出一个TypeError
,特别是TypeError:“bool”对象是不可编辑的
。我怀疑数据
实际上比表
长table
甚至可能是空的。现在您已经修复了输入错误,对于Python2.6上的两个测试,我都得到了True
,其中包含数据
和table
。顺便说一句,tuple(row)
返回的内容与tuple(x代表行中的x)
相同,只是它更短、更高效。@PM2Ring您说得对,谢谢。comp()
实现很好地解释了这一点。我最近在MarkLutz的“LearningPython”中读到过,据说序列/映射比较会逐个比较它们的项(如果不可散列的话)。然而,我不知道它是否发生在BFS或DFS的方式。
a= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"],2:{1:2, 2:3}}, (1,2),[(1, 2),{1:2}]]
b= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"],2:{1:2, 2:3}}, (1,2),[(1, 2),{1:2}]]
print(comp(a,b)) #True
a= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"], 5:4}, (1,2),[(1, 2),{1:2}]]
b= ['a', 1, [2, 3, {1:2, 2:3, 3:[1, 2, 3], 4:{1:2, 2:True }}], {1:[1,2,"sja"], 5:2}, (1,2),[(1, 2),{1:2}]]
print(comp(a,b)) #False
a=5
b="shasha"
print(comp(a,b)) #False
a=4
b=5
print(comp(a,b)) #False