2012-11-06 103 views
0

我有兩個表,表中的一個:比較嵌套列表

[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' 

我想這並沒有幫助。代碼有點單片(這就是爲什麼我最初沒有發佈它)。但我基本上試圖比較兩個值。另一個列表中第三個位置列表中項目的第一個值以及另一個列表中列出項目的第一個值。

呃......對不起。我試圖讓代碼更簡單,但它有點複雜。

+7

你需要提供你試過什麼的例子,因爲你有什麼是地獄混亂。 – Aesthete

+6

@Incredidave,直到你可以發表你的代碼,我們將暫時降低你Justokaydave。 –

+0

好的,我會發布一些。這可能會變得更混亂,但代碼是......循環。 – djcmm476

回答

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 

要測試的代碼只是將其複製到文件「的代碼。PY」,並運行它:

python -m doctest code.py 

你可以使它更有效使用集合和循環只有一次,但我什至不知道這個解決您的問題,所以我把它留給你。

+0

對於最近的回覆,我很抱歉,但我相信你可能會遇到正確的答案。只是嘗試在我的代碼中創建列表,它似乎正是我想要的。非常感謝(我知道代碼不是最容易使用的,令人討厭的是,這是關於我可以使用的最有用的格式)。 – djcmm476

1

答案是:將當前的數據結構轉換爲適當的數據結構。大概這些輸入是由你自己定義的,所以你不應該編寫更好的代碼來處理醜陋的結構,而是改進結構。如果您針對糟糕的API編寫代碼,請將API映射到有用的結構。

您必須發佈整個代碼才能得到正確答案,因爲問題出在定義中。我想你將不得不重構整個模塊並重新開始,因爲這只是糟糕的代碼。

一些想法:可以命令樹?排隊的列表?矩陣?一類?爲什麼項目的長度會有所不同,爲什麼要比較不同的子項目?嘗試使用類並覆蓋__cmp__

+0

你好,謝謝你的回答。不幸的是,這段代碼比我發佈的代碼要長得多,而且這個代碼是我能夠獲得的最佳格式。只是這一部分以一些奇怪的方式對它進行操作。無論如何,我感謝你回答。 – djcmm476