2015-05-14 12 views
18

Czy istnieje sposób na przekonanie się, aby podnieść wyjątek, jeśli zastąpi on klucz?Podnieś błąd, jeśli ze zrozumieniem w języku Python zostanie zastąpiony klucz

Na przykład, chciałbym następujące błędu, ponieważ istnieją dwa wartości dla klucza 'a':

>>> {k:v for k, v in ('a1', 'a2', 'b3')} 
{'a': '2', 'b': '3'} 

Zdaję sobie sprawę, można to zrobić za pomocą for pętli. Czy istnieje sposób, aby to zrobić, zachowując składnię ze zrozumieniem?

+2

Nie bez dodatkowego kodu. Można na przykład jawnie przetestować oczekiwaną długość. Składnia słownikowa działa tak samo jak zwykły słownik, ustawiając pary klucz-wartość, jeden po drugim, lub 'dict()', który można wywołać z sekwencją par klucz-wartość: last key wins. –

+0

Można użyć efektu ubocznego, aby sprawdzić, czy każdy klawisz był wcześniej widziany, ale nie można "podnieść" z poziomu słownika ze zrozumieniem. – jonrsharpe

+0

Czy możesz "wyrazić" w zrozumieniu słownika? Może ktoś inny może wywołać '.throw()' i rzucić wyjątek w zrozumienie dyktatu. Ale to prawdopodobnie nie jest dobry projekt. – Kevin

Odpowiedz

16

Można użyć generatora z funkcji pomocnika:

class DuplicateKeyError(ValueError): pass 

def dict_no_dupl(it): 
    d = {} 
    for k, v in it: 
     if k in d: raise DuplicateKeyError(k) 
     d[k] = v 
    return d 

dict_no_dupl((k, v) for k, v in ('a1', 'a2', 'b3')) 

To ma dodać funkcję pomocnika, ale zachowuje składnię rozumienia (rozsądnie) nienaruszone.

11

Jeśli nie obchodzi który klucz spowodował kolizję:

sprawdzić, czy generowany DICT ma odpowiedni rozmiar z len().

Powiązane problemy