2016-08-03 10 views
5

Pozwala zobaczyć fragment kodu poniżej:Ograniczony zestaw operacje na kluczowych widoków słownikowych pyton

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' 

jest ona wymieniona w oficjalnych dokumentach na dictionary view objects:

Keys poglądy są ustawione podobną ponieważ ich wpisy są unikalne i stabilne. .. Następnie te usytuowane operacje są dostępne („drugiej” odnosi się albo do inny widok lub zestawu): [&, | ^, ^]

Jeśli klucze są ustawione podobne, czemu są ustawić na nich operację ograniczoną do tych czterech operacji infiksów. Dlaczego, na przykład, zabroniona jest operacja bez skutków ubocznych, taka jak issuperset lub ?

+1

są 'Keys views' =' set-like 'nie jest' ustawieniem' samym. Jeśli chcesz wykonać operacje zestawów, przekształć widok kluczy w zestaw. – levi

+0

@levi na jakie podstawowe są niektóre, a nie inne, wybrane ustawienia? – DurgaDatta

+0

'issubsert' nie jest' issubset'. –

Odpowiedz

6

Dlaczego, na przykład, nie są efektem ubocznym działania wolny jak issuperset lub issubset pracy nie jest dozwolone?

Są; po prostu trzeba użyć >= i <= operatory:

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

Wspierają one również isdisjoint w postaci metody, ponieważ nie ma operator za nim:

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

Czy istnieje jakiś powód, dla którego operacje testowania podzbiorów/podzbiorów nie są dostępne w formie metody? – DurgaDatta

+0

@DurgaDatta: Nie wiem. [Dict view PEP] (https://www.python.org/dev/peps/pep-3106/) zaproponował implementację formularzy metod, ale w pewnym momencie postanowili tego nie robić. Prawdopodobnie jest rozmowa o tym pochowana gdzieś tak jak lista mailingowa Python-Dev lub tracker problemów. – user2357112