我有一個元組列表,用於識別項目之間的成對關係。從成對明智組合中識別集合
[(1,2), (2,3), (3,1), (4,5), (5,4), (6,7)]
我想要在整個元組的外觀和它們摺疊成獨特的收藏如下(也許作爲一個哈希地圖 - 任何其他有效的數據結構):
{a: (1,2,3), b: (4,5), c(6,7)}
是否有確實的算法這是有效的 - 我現在只能想到一種暴力方法。
尋求在Python或R中實現這個。我原來的例子有大約2800萬個元組。
我有一個元組列表,用於識別項目之間的成對關係。從成對明智組合中識別集合
[(1,2), (2,3), (3,1), (4,5), (5,4), (6,7)]
我想要在整個元組的外觀和它們摺疊成獨特的收藏如下(也許作爲一個哈希地圖 - 任何其他有效的數據結構):
{a: (1,2,3), b: (4,5), c(6,7)}
是否有確實的算法這是有效的 - 我現在只能想到一種暴力方法。
尋求在Python或R中實現這個。我原來的例子有大約2800萬個元組。
你基本上想找到連接的組件。爲此,scipy中有一個功能connected_components。你只需要重新詮釋你的數據位:
l = [(1,2), (2,3), (3,1), (4,5), (5,4), (6,7)]
from scipy.sparse.csgraph import connected_components
from scipy.sparse import csr_matrix
# make list of unique elements
uniques = list(set(list(map(lambda a: a[0], l)) + list(map(lambda a: a[1], l))))
# reverse index to lookup elements index
unique2index = dict([(el, i) for (i, el) in enumerate(uniques)])
# prepare data for csr_matrix construction
data = [1 for x in l] # value 1 -- means edge
data_i = [unique2index.get(x[0]) for x in l] # source node
data_j = [unique2index.get(x[1]) for x in l] # target node
graphMatrix = csr_matrix((data, (data_i, data_j)),shape=(len(uniques), len(uniques)))
(numComponents, labels) = connected_components(graphMatrix) # here is the work done
# interpret labels back to original elements
components = [[uniques[j] for (j,x) in enumerate(labels) if x==i] for i in range(0, numComponents)]
print(components) # [[1, 2, 3], [4, 5], [6, 7]] is printed
我想指出'components = ...'步驟在輸入的唯一元素的數量上是二次的。 groupby'import itertools可能會更快; list(map(lambda group:list([uniques [el [0]] for el in group [1]]),itertools.groupby(enumerate(labels),lambda x:x [1])))'but I不喜歡進行另一次導入,並且可讀性....(我個人不喜歡python,因爲一次不能寫可讀性和簡單性) –
這基本上是你中的R想要的東西:http://stackoverflow.com/a/38663293/2372064 – MrFlick
此外 - http://stackoverflow.com/questions/12135971 /如果在列表中是'[(1,2),(3,4)]',則識別鏈接集的鏈接集合 – thelatemail
。你想要它:'{a:(1,2),b:(3,4)}或'{a:(1,2,3,4)}? –