2016-08-03 55 views
5

讓我們來看看下面的代碼片段:限制集合操作

d = {1:1} 
keys = d.keys() 

print(keys & {1,2,3})# {1} 
d[2] = 2 
print(keys & {1,2,3}) # {1,2} # keys() is a view/reference 
print({1,2}.issubset({1,2,3})) # True 
print(keys.issubset({1,2,3})) # 'dict_keys' object has no attribute 'issubset' 

它在官方文件中提到的dictionary view objects

鍵看法載樣,因爲他們的作品是獨一無二的。 ..然後,這些組操作是可用的(「其他」是指要麼 另一視圖或一組):&,|,^,^]

如果密鑰被設置狀,爲什麼是對他們進行的操作僅限於這四種中綴操作。例如,爲什麼不允許使用副作用,如issupersetissubset

+1

他們是'鍵views' ='設置樣'不是'set'本身。如果您想執行集合操作,請將您的按鍵視圖轉換爲集合。 – levi

+0

@levi選擇什麼樣的基本操作而不是其他操作? – DurgaDatta

+0

'issubsert'不是'issubset'。 –

回答

6

爲什麼不能像issupersetissubset這樣的不允許副作用的操作?

他們是;你只需要使用>=<=運營商:

print(keys <= {1, 2, 3}) 

它們還支持isdisjoint的方法形式,因爲有它無需操作員:

print(keys.isdisjoint({1, 2, 3})) 
+1

是否有任何理由超級集合/子集測試操作不可用方法形式? – DurgaDatta

+0

@DurgaDatta:我不知道。 [字典視圖PEP](https://www.python.org/dev/peps/pep-3106/)提出了實現該方法的形式,但在某些時候,他們決定不這樣做。關於它可能會被埋在Python-Dev郵件列表或問題跟蹤器等地方。 – user2357112