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