2012-02-28 75 views
0

我有實施蟒蛇算法做了以下的麻煩: (這是一個嘗試實現朋友算法的一個朋友的一部分)Python列表收縮

鑑於形式的列表[A,B ],[c,d],[e,f],...] 我想創建一個[[a,a1,a2,a3,...],[b,b1,b2 ,b3,...],[c,c1,c2,c3,...],...]。

使這個更清晰的例子如下:給出一個列表 [[0,1],[0,4],[0,3],[0,423],[1,232],[1, 2],[2,444],[2,12]]

我想輸出將所有元素與第一個整數分組,因此輸出將是 [[0,1,4,3,432],[1, 232,2],[2,444,12]]

備註:我已根據每個項目中的第一個元素對輸入列表進行了排序。

我一直在爲如何以一種有效的方式實施這個一段時間了,並希望得到一些建議/建議如何實現這一點。

P.S.最終,我希望這個結合所有「喜歡」的條款。我的意思是採取上面的例子,而不是獲得輸出[[0,1,4,3,432],[1,232,2],[2,444,12]]我會得到 [[0,1 ,4,3,432],[1,232,2,444,12]],其中「2」項及其共享元素已加入與「1」項相關的元素,因爲1與2相關。最後一部分可能會令人困惑,但是如果有意義的話,建議也會受到歡迎!否則,忽略這最後一部分。 =]再次感謝!

謝謝!

+5

什麼都有你試過了嗎?你正在採取一種有效的方式來做到這一點;你可以發佈你的「低效」版本嗎? – 2012-02-28 06:09:53

+0

好吧,我一直沒能想出任何這樣做,這就是爲什麼我決定尋求幫助。 – AdrianV 2012-02-28 06:12:26

+0

這聽起來像你應該調查[圖](http://en.wikipedia.org/wiki/Graph_(abstract_data_type))數據結構。 – GWW 2012-02-28 06:13:26

回答

0

試試這個:

from collections import defaultdict 

friends = defaultdict(set) 
friendpairs = [[0,1], [0,4], [0,3], [0,432], [1,232], [1,2], [2,444], [2,12]] 

for f1,f2 in friendpairs : friends[f1].add(f2) 

friendOfFriends = dict((guy,fr.copy()) for guy,fr in friends.iteritems()) 

for f1 in friendOfFriends: 
    for f2 in friends[f1]: 
     friendOfFriends[f1].update(friends[f2]) 

UPD:您也可以替換最後一行與

 friendOfFriends[f1].update(friends.get(f2,())) 

到獸醫預科在friends收集

+0

謝謝,我相信這完美地解決了我的問題......現在,我只需要詳細閱讀這裏發生的事情 – AdrianV 2012-02-28 07:10:12

1

出現的空套使用itertools.groupby()

from itertools import groupby 
from operator import itemgetter 

data = [[0, 1], [0, 4], [0, 3], [0, 423], [1, 232], [1, 2], [2, 444], [2, 12]] 
result = [[k] + list(zip(*g)[1]) for k, g in groupby(data, key=itemgetter(0))] 

使用詞典:

result = {} 
for k, v in data: 
    result.setdefault(k, []).append(v) 
result = sorted([k] + v for k, v in result.iteritems()) 
0

沒有Ultimately部分,你可以簡單地這樣做:

>>> a = [[0,1], [0,4], [0,3], [0,423], [1,232], [1,2], [2,444], [2,12]] 
>>> d = dict() 
>>> for x, y in a: 
...  if x in d: 
...    d[x].append(y) 
...  else: 
...    d[x] = [y] 
... 
>>> d 
{0: [1, 4, 3, 423], 1: [232, 2], 2: [444, 12]} 
>>> [[x] + d[x] for x in d] 
[[0, 1, 4, 3, 423], [1, 232, 2], [2, 444, 12]] 
0

這是快速和簡單,我可以得到它:

data=iter([[0,1], [0,4], [0,3], [0,423], [1,232], [1,2], [2,444], [2,12]]) 
result = [next(data)] 

for pair in data: 
    if result[-1][0]==pair[0]: 
     result[-1].append(pair[1]) 
    else: 
     result.append(pair) 

print result 
"[[0, 1, 4, 3, 423], [1, 232, 2], [2, 444, 12]]"