2016-06-12 58 views
3

我想計算一組整數中所有元素之間的絕對差異。我正在嘗試abs(x-y),其中xy是該集合中的兩個元素。我想爲所有組合做到這一點,並將結果列表保存在一個新的集合中。Python:計算一組整數中所有元素之間的差異

+4

作爲蟒集合是無序的,沒有「最後一個元素」。你可以在做你的東西之前將它轉換成列表。 'list(yourset)' – MaxNoe

+1

一般而言,您可以將任何集合轉換爲列表(list(myset)),然後使用列表算法。但也許如果你提供了一個你想要實現的例子,那麼可能會有更好的方法。 – miraculixx

+1

python set是「無序的獨特元素集合」。所以沒有「Python集合中的最後一個元素」的含義 – Eular

回答

2

我要計算所有元素之間的絕對差額在一組整數(...)並保存在一組新的結果列表。

您可以使用itertools.combinations

s = { 1, 4, 7, 9 } 
{ abs(i - j) for i,j in combinations(s, 2) } 
=> 
set([8, 2, 3, 5, 6]) 

combinations返回所有組合的R-長度元組s中無需更換,即:

list(combinations(s, 2)) 
=> 
[(9, 4), (9, 1), (9, 7), (4, 1), (4, 7), (1, 7)] 
+0

有沒有更快的方法?對於更大的套件來說,花費的時間太長(> 10秒)。 –

0

由於集合不保持順序,所以可以使用類似於ordered-set的東西並迭代到最後一個,但是隻有一個。

0

爲了完整起見,這裏的基礎上的解決方案Numpy ndarray's和pdist()

In [69]: import numpy as np 

In [70]: from scipy.spatial.distance import pdist 

In [71]: s = {1, 4, 7, 9} 

In [72]: set(pdist(np.array(list(s))[:, None], 'cityblock')) 
Out[72]: {2.0, 3.0, 5.0, 6.0, 8.0} 
0

下面是另一種解決方案基於numpy的:

data = np.array([33,22,21,1,44,54]) 

minn = np.inf 
index = np.array(range(data.shape[0])) 
for i in range(data.shape[0]): 
    to_sub = (index[:i], index[i+1:]) 
    temp = np.abs(data[i] - data[np.hstack(to_sub)]) 
    min_temp = np.min(temp) 
    if min_temp < minn : minn = min_temp 
print('Min difference is',minn) 

輸出:「最小差爲1」