比较嵌套列表

时间:2012-11-06 22:06:59

标签: python list

我有两个列表,其中一个是:

[a1, b1, [[c1, d1, e1], [f1, g1, h1], etc, etc], etc]

和另一个字典,其条目的格式为:

[[a2, b2, c2], [d2, e2, f2], etc, etc]

我需要比较那两个子列表的第一个条目,找到任何相同的条目,并且第一个条目中的任何一个都不会出现在第二个。

敌人的例子,如果c1 = d2,我想知道,如果f1不等于a2d2,我想要知道那个。

无论如何,我在执行此操作时遇到了一些麻烦,任何帮助都会受到赞赏。

谢谢!

(我不确定列表格式有多清楚,对不起,如果它们仍然令人困惑的话)

代码示例:

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'

我想这没有用。代码有点单片(这就是我最初没有发布的原因)。但我基本上试图比较两个值。另一个列表的第3个位置的列表中的项的第一个值以及另一个列表中包含的列表中的项的第一个值。

嗯...对不起。我已经尝试使代码更简单,但它有点复杂。

2 个答案:

答案 0 :(得分:3)

我不确定我是否理解你的问题,但我会试一试。 我想你只需要比较每个元素的第一个元素 3个元素的子列表。

首先,我将所有第一个元素分开,然后制作comprarisson。

以下是一些doctest的代码,因此您可以检查它是否符合您的要求 正在问:

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

你可以使用套装和循环一次更高效但我甚至不确定这会解决你的问题,所以我会把它留给你。

答案 1 :(得分:1)

答案是:将您当前的数据结构转换为适当的数据结构。大概输入是由你自己定义的,所以你不应该编写更好的代码来处理丑陋的结构,而是改进结构。如果您正在编写错误的API,请将API映射到有用的结构。

您必须发布整个代码才能得到正确答案,因为问题出在定义中。我想你将不得不重构整个模块并重新开始,因为这只是糟糕的代码。

一些想法:可以命令成为一棵树吗?一个排队的名单?矩阵?一类?为什么项目的长度各不相同,为什么要比较不同的子项?尝试使用类并覆盖__cmp__