2017-10-13 33 views
0

對不起,奇怪的標題不知道如何更好地解釋它(隨意編輯它)。Python:對於set1中的每個項目,使用set1中的其他項作爲值的字典

我無法弄清楚如何(高效地)執行以下操作。比方說,我有一組{a,b,c},我想下面的輸出:

{a: {b,c}} 
{b: {a,c}} 
{c: {a,b}} 

我找到了一種方法來做到這一點,但我認爲這不是有效的/ Python的(因爲我懷疑有Python中的函數這樣做):

set1 = {'a','b','c'} 
output = [] 
for item in set1: 
    temp_set = set1.copy() 
    temp_set.remove(item) 
    output.append({item: temp_set}) 
print(output) 

這將打印:[{'b': {'c', 'a'}}, {'c': {'b', 'a'}}, {'a': {'b', 'c'}}]

+0

我在這裏找不到任何特別低效的東西。可能用'temp_set = {x for set1中的x,如果x!= item}替換循環中的前兩行,以避免必須刪除元素,但是沒有分析我真的不知道它是否更快。 – Amadan

回答

4

是的,有一個更緊湊的方式:使用set difference操作。

set1 = {'a','b','c'} 
output = [{u: set1-{u}} for u in set1] 
print(output) 

輸出

[{'c': {'a', 'b'}}, {'a': {'c', 'b'}}, {'b': {'c', 'a'}}] 

另一個相關的方式做,這是從u,而不是一組做出1項元組。好處是元組比組更簡單,並且構建更快; OTOH,Python集合相當高效,儘管它們確實具有散列表的開銷。

set1 = {'a','b','c'} 
output = [{u: set1.difference((u,))} for u in set1] 
print(output) 

此代碼給出與前面的代碼等效的輸出。

儘管我們正在調用set差異方法,該方法實際上並未從其可迭代arg構建集合,但它只是直接對其進行迭代。

+0

緊湊,也許;實例化一個新的集合,以便可以減去它,可能不是超高效的。仍然,更好的配置文件 – Amadan

+0

@Amadan公平點,雖然設置建設是相當便宜。如果我們使用設置差異的方法形式,我們可以用一個元組來完成。但這並不是真正的節約。 –

+0

@Amadan我不明白爲什麼'set1- {u}'需要構建一個從中減去的額外集合。 – schwobaseggl

0

PM 2Ring的集合差分方法很好,最緊湊。爲了完整起見,並且由於它更普遍適用,例如如果你想你的字典值是列表,元組或生成器,應該建議以下基於條件理解的版本:

output = [{u: {x for x in set1 if x != u}} for u in set1] 
# output = [{u: [x for x in set1 if x != u]} for u in set1] 
# output = [{u: (x for x in set1 if x != u)} for u in set1] 
+0

我懷疑內部集合理解中的Python循環將比通過設置差分操作執行的內部循環慢得多。另外,我們不能存儲不可複製的東西,如列表中的集合,所以沒有太過籠統的意義。 –

+0

@ PM2Ring我同意表演的一部分。但字典值不一定是可散列的。我添加了兩個例子來說明我的觀點。 – schwobaseggl

+0

字典的值肯定不需要可排除,但字典鍵和設置項目。 –

相關問題