Python 比较嵌套列表
我有两个列表,其中一个是:Python 比较嵌套列表,python,list,Python,List,我有两个列表,其中一个是: [a1, b1, [[c1, d1, e1], [f1, g1, h1], etc, etc], etc] 另一个是词典,其条目的形式如下: [a1, b1, [[c1, d1, e1], [f1, g1, h1], etc, etc], etc] [[a2、b2、c2]、[d2、e2、f2]等] 我需要比较这两个子列表中的第一个条目,找出任何相同的条目,以及第一个子列表中的任何条目在第二个子列表中根本没有出现 例如,如果c1=d2,我想知道,如果f1不等于a2或
[a1, b1, [[c1, d1, e1], [f1, g1, h1], etc, etc], etc]
另一个是词典,其条目的形式如下:
[a1, b1, [[c1, d1, e1], [f1, g1, h1], etc, etc], etc]
[[a2、b2、c2]、[d2、e2、f2]等]
我需要比较这两个子列表中的第一个条目,找出任何相同的条目,以及第一个子列表中的任何条目在第二个子列表中根本没有出现
例如,如果c1=d2
,我想知道,如果f1
不等于a2
或d2
,我想知道
不管怎么说,我在正确实现这一点上遇到了一些困难,任何帮助都将不胜感激
谢谢
(我不确定列表格式理解得有多清楚,如果它们仍然让人困惑,很抱歉)
代码示例:
for row in range(0, len(command[2])):
counter = 0
for nodeRows in range(0, len(nodeTable[command[0]])):
if nodeTable[command[0]][nodeRows][0] == command[2][row][0]:
if ((command[2][row][2]) + 1) < nodeTable[command[0]][nodeRows][2]:
counter += 1
newrow = command[2][row]
newrow[1] = command[1]
newrow[2] = newrow[2] + 1
nodeTable[command[0]][nodeRows] = newrow
change = 'true'
用于范围(0,len(命令[2])中的行:
计数器=0
对于范围(0,len)(节点表[command[0]])中的节点视图:
如果节点表[command[0]][nodeRows][0]==命令[2][row][0]:
如果((命令[2][row][2])+1)
我想这没用。代码有点单一(这就是我最初没有发布它的原因)。但我基本上是在比较两个值。另一个列表第3位置的列表中的项目的第一个值和另一个列表中包含的列表中的项目的第一个值
嗯……对不起。我尝试过使代码更简单,但有点复杂。答案是:将当前的数据结构转换为适当的数据结构。假设输入由您自己定义,因此您不应该编写更好的代码来处理难看的结构,而应该改进结构。如果您是针对坏API编写的,请将API映射到有用的结构 您必须发布整个代码才能得到正确的答案,因为问题在于定义。我想您必须重构整个模块,然后重新开始,因为这只是一段糟糕的代码
一些想法:命令可能是一棵树吗?排队的名单?矩阵?一节课?为什么项目的长度不同,为什么要比较不同的子项目?尝试使用类并重写
\uuucmp\uuuu
答案是:将当前数据结构转换为适当的数据结构。假设输入由您自己定义,因此您不应该编写更好的代码来处理难看的结构,而应该改进结构。如果您是针对坏API编写的,请将API映射到有用的结构
您必须发布整个代码才能得到正确的答案,因为问题在于定义。我想您必须重构整个模块,然后重新开始,因为这只是一段糟糕的代码
一些想法:命令可能是一棵树吗?排队的名单?矩阵?一节课?为什么项目的长度不同,为什么要比较不同的子项目?尝试使用类并重写
\uuu cmp\uuuuu我不确定我是否正确理解了您的问题,但我会尝试一下。
我想你只需要比较每个元素的第一个元素
3个元素的子列表
首先我分离所有的第一个元素,然后做比较
下面是一些代码,您可以检查它是否符合您的要求
你在问:
def compare(l0, l1):
"""
>>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
>>> l1 = [[11, 21, 31], [41, 51, 61], [71, 81, 91]]
>>> compare(l0, l1)
([], [10, 40, 70])
>>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
>>> l1 = [[10, 21, 31], [41, 51, 61], [71, 81, 91]]
>>> compare(l0, l1)
([10], [40, 70])
>>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
>>> l1 = [[10, 21, 31], [40, 51, 61], [70, 81, 91]]
>>> compare(l0, l1)
([10, 40, 70], [])
"""
first_entries_l0 = [x[0] for x in l0[2]]
first_entries_l1 = [x[0] for x in l1]
equals = [x for x in first_entries_l0 if x in first_entries_l1]
unique = [x for x in first_entries_l0 if x not in first_entries_l1]
return equals, unique
要测试代码,只需将其复制到文件“code.py”并使用以下命令运行:
python -m doctest code.py
您可以只使用一次集合和循环来提高效率,但我甚至不确定这是否解决了您的问题,所以我将把它留给您。我不确定我是否正确理解了您的问题,但我会尝试一下。
我想你只需要比较每个元素的第一个元素
3个元素的子列表
首先我分离所有的第一个元素,然后做比较
下面是一些代码,您可以检查它是否符合您的要求
你在问:
def compare(l0, l1):
"""
>>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
>>> l1 = [[11, 21, 31], [41, 51, 61], [71, 81, 91]]
>>> compare(l0, l1)
([], [10, 40, 70])
>>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
>>> l1 = [[10, 21, 31], [41, 51, 61], [71, 81, 91]]
>>> compare(l0, l1)
([10], [40, 70])
>>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
>>> l1 = [[10, 21, 31], [40, 51, 61], [70, 81, 91]]
>>> compare(l0, l1)
([10, 40, 70], [])
"""
first_entries_l0 = [x[0] for x in l0[2]]
first_entries_l1 = [x[0] for x in l1]
equals = [x for x in first_entries_l0 if x in first_entries_l1]
unique = [x for x in first_entries_l0 if x not in first_entries_l1]
return equals, unique
要测试代码,只需将其复制到文件“code.py”并使用以下命令运行:
python -m doctest code.py
您可以只使用一次集合和循环来提高效率,但我甚至不确定这是否解决了您的问题,所以我将把这个问题留给您。您需要提供一个您尝试过的示例,因为您所拥有的非常混乱。@Incredidave,在您发布代码之前,我们将暂时将您降级为Justokaydave。好的,我会发一些。这可能会让人更加困惑,代码是……循环的。2是什么?我们可以从一些魔术索引的描述性符号开始吗。。。可能会有更好的帮助。好的,Incredi-状态已恢复。我不会把它描述成“有趣的嵌套”,你可以考虑让下一个人(很可能是你)更容易理解,比如给“代码>命令[2 ] [RO](2)] +“1”<代码>,例如“<代码> DEF命令文件FROB(CMD,ROW):返回CMD[2 ] [RO] [2 ] < /COD>。或者更好的方法是,利用另一个数据结构,比如新的类
或名为tuple
。您需要提供一个您尝试过的示例,因为您的示例非常混乱。@Incredidave,在您发布代码之前,我们将暂时将您降级为Justokaydave。好的,我将发布一些。这可能会让人更加困惑,代码是……循环的。2是什么?我们可以从一些魔术索引的描述性符号开始吗。。。可能会有更好的帮助。好的,Incredi-状态已恢复。我不会把它描述成“有趣的嵌套”,你可以考虑让下一个人(很可能是你)更容易理解,比如给“代码>命令[2 ] [RO](2)] +“1”<代码>,例如“<代码> DEF命令文件FROB(CMD,ROW):返回CMD[2 ] [RO] [2 ] < /COD>。或者更好的是,利用另一种数据结构,比如新的类
或名为tuple
。很抱歉回复太晚,但我相信您可能找到了正确的答案。只是t