Python обратный / инвертировать отображение

Я не владею английским языком, поэтому я склонен использовать либо 1, либо 0, либо 1 и 0. Использование «Y» и «N» имеет мало смысла, если вы не кодируете на английском языке (да, кодировка на родном языке существует). Использование «SI» и «NO» или «S» и «N» не выглядит профессиональным (точно так же, как именование переменных с акцентированными буквами). Напротив, ноты и ноль довольно стандартизированы, если вы закодированы в C, PHP или JavaScript. В любом случае, я всегда добавляю соответствующее ограничение, чтобы запретить любой другой символ. Помимо субъективных проблем, я не думаю, что при выборе CHAR или NUMBER заметно увеличение производительности. Мне нравятся номера немного больше, потому что мне не нужно их процитировать:)

Я согласен, что это вопиющее упущение, но я читал серьезно горячие дискуссии по этому вопросу на некоторых форумах Oracle; это своего рода религиозная проблема. Некоторые утверждают, что булевы относятся к типам данных приложения и не имеют места в ядре базы данных. Честно говоря, я считаю, что это один из тех, кого мы так долго не знали, что мы лучше говорили, что это было по назначению.

Кстати, у MySQL есть тип BOOLEAN, но это синоним TINYINT (1 ), поэтому он в конечном итоге равен 1 и 0; что хорошо, потому что он также имеет константы TRUE и FALSE, которые оценивают 1 и 0.

553
задан Mark Amery 15 July 2019 в 02:57
поделиться

6 ответов

Для Python 2.7.x

inv_map = {v: k for k, v in my_map.iteritems()}

для Python 3 +:

inv_map = {v: k for k, v in my_map.items()}
810
ответ дан Dave Lasley 2 October 2019 в 01:33
поделиться

Если значения в my_map не уникальны:

inv_map = {}
for k, v in my_map.iteritems():
    inv_map[v] = inv_map.get(v, [])
    inv_map[v].append(k)
118
ответ дан Rick Teachey 2 October 2019 в 01:33
поделиться
  • 1
    Спасибо. Лично, я don' t как эта путаница подчеркивания;) – Thanks 9 May 2009 в 03:13

Предположение, что значения в dict уникальны:

dict((v, k) for k, v in my_map.iteritems())
165
ответ дан Rick Teachey 2 October 2019 в 01:33
поделиться
  • 1
    Мой (ограниченный) опыт: Если Вы разделяете один на подклассы из Apple' s классы, и добавляют переменную экземпляра, которая сталкивается с одним из superclass' частный ivars, XCode обычно предупреждает Вас (независимо от присутствия подчеркивания). Я утверждал, что код отформатировал этот путь (т.е. ivars запускаются с подчеркивания), и не были отклонены до сих пор. – Nicolas Miari 30 January 2012 в 17:55

Попробуйте это:

inv_map = dict(zip(my_map.values(), my_map.keys()))

(Отмечают, что документы Python о представлениях словаря явно гарантия, которые .keys() и .values() имеют их элементы в том же порядке, который позволяет подходу выше работать.)

, Кроме того:

inv_map = dict((my_map[k], k) for k in my_map)

или Python использования 3.0's dict понимания

inv_map = {my_map[k] : k for k in my_map}
32
ответ дан Rick Teachey 2 October 2019 в 01:33
поделиться
  • 1
    Я просто потратил возрасты, разыскивающие проблему управления памятью из-за переменной, не сохраняемой, так как я использовал таймер вместо self.timer. После этого опыта я настоятельно рекомендую использование _ перед всеми частными переменными – Casebash 4 February 2010 в 10:29

Чтобы сделать это с сохранением типа отображения (предполагается, что это подкласс dict или dict ):

def inverse_mapping(f):
    return f.__class__(map(reversed, f.items()))
41
ответ дан 22 November 2019 в 22:01
поделиться

Если значения не уникальны, и вы немного хардкор:

inv_map = dict(
    (v, [k for (k, xx) in filter(lambda (key, value): value == v, my_map.items())]) 
    for v in set(my_map.values())
)

Обратите внимание, особенно для большого словаря, это решение намного меньше эффективнее, чем ответ Python реверсирует / инвертирует отображение , потому что он многократно перебирает items () .

2
ответ дан 22 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: