2013-06-02 33 views
2

我有以下陣列:如何分組這個python列表?

[1 , 2] 
[1 , 3] 
[1 , 4] 
[2 , 3] 
[2 , 4] 
[5 , 1] 

我想打印類似以下的輸出:

"Items related to 1:" 

     2, 3, 4, 5 *note this last one was on the first column and 1 in the second 

    "Items related to 2: 

     3, 4 

    "Items related to 3:" 
     1, 2 

    "Items related to 4:" 
     1, 2 

    "Items related to 5:" 
     1 

任何想法?

回答

4
def print_related(xs): 
    d = {} 
    for (a, b) in xs: 
     d.setdefault(a, set()).add(b) 
     d.setdefault(b, set()).add(a) 
    for k in d: 
     print "Items related to %s:" % k 
     print " " + repr(d[k]) 

這將打印樣本輸入作爲

Items related to 1: 
    set([2, 3, 4, 5]) 
Items related to 2: 
    set([1, 3, 4]) 
Items related to 3: 
    set([1, 2]) 
Items related to 4: 
    set([1, 2]) 
Items related to 5: 
    set([1]) 

可以使用代替repr自己的函數以不同的打印設置,使用不同的數據結構,如果你關心的重複等

根據下面的raymonad的評論,您還可以使用defaultdict來避免兩個setdefault調用。此更改和添加哈克的方式來打印的相關項目結果的組中的所需表示在

import collections 

def print_related(xs): 
    d = collections.defaultdict(set) 
    for (a, b) in xs: 
     d[a].add(b) 
     d[b].add(a) 
    for k in d: 
     print "Items related to %s:" % k 
     print " " + repr(d[k])[5:-2] 

打印出組爲2, 3, 4, 5

+0

我寧願'd = defaultdict(套)',這樣你就可以擺脫在循環中的兩個'setdefault()'調用。 – raymonad

+0

@raymonad:好的,謝謝!我會編輯它。 –

+0

謝謝,像奇蹟般的作品! – user2091936

0

我會建議使用字典,其中的關鍵是數組中的值,而鍵的值是相關值的列表。

因此,在這種情況下,它看起來像:

{1: [2, 3, 4, 5], 
2: [1, 3, 4], # You missed `1` but it is related to `2` 
3: [1, 2], 
4: [1, 2], 
5: [1]} 

現在,這將是容易產生假設「關係」是不是多餘的。你可以這樣做:通過在給定列表中的元素

  • 迭代:

    • 通過列表迭代

    • 如果當前元素是不是在字典中的一個關鍵,它添加作爲密鑰,並且在陣列在字典中作爲密鑰添加其他值作爲鍵值

    • 如果當前元素是,該對中的另一元件附加到列表中

    如果你沒有多餘的關係,這也是有效的。如果你確實有多餘的關係,那麼set可能就是你想要的,而不是列表中的鍵值。

  • 1

    該做的伎倆:

    L = [[1 , 2], 
        [1 , 3], 
        [1 , 4], 
        [2 , 3], 
        [2 , 4], 
        [5 , 1]] 
    
    from collections import defaultdict 
    
    assoc = defaultdict(set) 
    
    for a, b in L: 
        assoc[a].add(b) 
        assoc[b].add(a) 
    for k, v in assoc.items(): 
        print(k, v) 
    
    
    1 {2, 3, 4, 5} 
    2 {1, 3, 4} 
    3 {1, 2} 
    4 {1, 2} 
    5 {1}