Обратите внимание, что делает словарь нечувствительно к регистру, каким бы то ни среднее, вполне может потерять информацию, например, как бы вы «регистру insensitivize "{'a': 23, 'A': 45}
?! Если все, что вам все равно, где ключ находится в Словаре или нет (то есть, не заботятся о том, что значение соответствует ему), то сделать set
вместо этого - т.е.
theset = set(k.lower() for k in thedict)
(в каждой версии Python , или {k.lower() for k in thedict}
, если вы довольны тем, что ваш код работает только в Python 2.7 или более поздней версии ради какого-то чисто декоративного синтаксического сахара ;-), и проверьте с помощью if k.lower() in theset: ...
.
Или вы могли бы сделать класс-оболочку, например, может быть, только для чтения один ...:
import collections
class CaseInsensitiveDict(collections.Mapping):
def __init__(self, d):
self._d = d
self._s = dict((k.lower(), k) for k in d)
def __contains__(self, k):
return k.lower() in self._s
def __len__(self):
return len(self._s)
def __iter__(self):
return iter(self._s)
def __getitem__(self, k):
return self._d[self._s[k.lower()]]
def actual_key_case(self, k):
return self._s.get(k.lower())
Это будет держать (без фактического изменения исходного словаря, поэтому все точная информация все еще может быть извлекать для него, если и когда необходимо) произвольное одно из возможных кратных значений для ключей, которые «сворачиваются» в один ключ из-за нечувствительности к регистру и предлагают все доступные только для чтения словари (только со строковыми ключами) плюс метод actual_key_case
, возвращающий фактическую комбинацию случаев, используемую для любого заданного строкового ключа (или None
, если никакая модификация этого заданного строкового ключа не соответствует любому ключу в словаре).
Вы хотите, чтобы решения, Я использовал карту - вот как я прочитал вопрос в первый раз. –
См. [PEP-455] (https://www.python.org/dev/peps/pep-0455/): это запланировано для включения стандартной библиотеки в Python 3.5 (как 'collections.TransformDict', если преобразование 'str.casefold' или аналогичный) –
[PEP-455 был в конечном счете отклонен.] (https://www.python.org/dev/peps/pep-0455/#rejection) –