Принуждение словаря к кортежу для использования с endwith в строке

Данный словарь:

dictMnths = dict((v,k) for k,v in enumerate(calendar.month_abbr))

Я бы предпочел использовать dictMonths аналогично приведенному ниже кортежу ('Jan','Feb'):

'aaFeb'.endswith(('Jan','Feb'))
# True

Попытки

keys()

'aaFeb'.endswith(dictMnths.keys())
# TypeError: endswith first arg must be str or a tuple of str, not dict_keys

str()

'aaFeb'.endswith(str(dictMnths.keys()))
# False

Это нежелательный ответ, поскольку dictMonths содержит Feb.

Если я не ошибаюсь, dict.keys() является прокси для фактических данных (в Python 3 в версии 2.x он возвращает список). Вот почему он сообщает вам, что это от типа dict_keys. попробуйте передать его в кортеж tuple(dictMnths.keys))

Chen A. 11.04.2018 14:21

Я не знаю, предназначено ли это, но имейте в виду, что ваш словарь будет иметь пустую строку в качестве одного из ключей, поэтому каждая строка будет заканчиваться этим.

Patrick Haugh 11.04.2018 14:23

@PatrickHaugh Отлично подмечено, спасибо.

Konrad 11.04.2018 14:27
0
3
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование tuple() должно помочь.

import calendar
dictMnths = dict((v,k) for k,v in enumerate(calendar.month_abbr))
print('aaFeb'.endswith(tuple( dictMnths.keys()))) # or 'aaFeb'.endswith(tuple(filter(None, dictMnths.keys())))

Выход:

True

Примечание: Я использовал filter(None, dictMnths.keys()) только для удаления пустых элементов.

Или они могут просто использовать enumerate(calendar.month_abbr[1:], 1), чтобы избежать пустой строки

Duncan 11.04.2018 14:35

@ Дункан. Спасибо, я согласен, что фильтр не требуется. Я просто вставил это как fyi.

Rakesh 11.04.2018 14:36

Другие вопросы по теме