Python словарь со списком ключевых слов - PullRequest
1 голос
/ 30 декабря 2011

Я кодирую цепочку Маркова N-го порядка.

Это выглядит примерно так:

class Chain:
 def __init__(self, order):
  self.order = order
  self.state_table = {}
 def train(self, next_state, *prev_states):
  if len(prev_states) != self.order: raise ValueError("prev_states does not match chain order")
  if prev_states in self.state_table:
   if next_state in self.state_table[prev_states]:
    self.state_table[prev_states][next_state] += 1
   else:
    self.state_table[prev_states][next_state] = 0
  else:
   self.state_table[prev_states] = {next_state: 0}

К сожалению, список и кортежи не подлежат изменению, и я не могу использовать их в качестве ключевых слов в комментариях ... Надеюсь, я достаточно хорошо объяснил свою проблему, чтобы вы поняли, чего я пытаюсь достичь.

Любые хорошие идеи, как я могу использовать несколько значений для словаря ключевых слов?

Дополнительный вопрос:

Я не знал, что кортежи можно хэшировать. Но энтропия для хэшей кажется низкой. Возможны ли хэш-коллизии для кортежей?!

Ответы [ 2 ]

6 голосов
/ 30 декабря 2011

Кортежи могут быть хэшируемыми, когда их содержимое.

>>> a = {}
>>> a[(1,2)] = 'foo'
>>> a[(1,[])]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Что касается коллизий, когда я пытаюсь связать очень похожие кортежи, я вижу, что они отображаются друг от друга широко:

>>> hash((1,2))
3713081631934410656
>>> hash((1,3))
3713081631933328131
>>> hash((2,2))
3713082714462658231
>>> abs(hash((1,2)) - hash((1,3)))
1082525
>>> abs(hash((1,2)) - hash((2,2)))
1082528247575
3 голосов
/ 30 декабря 2011

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

Не беспокойтесь о коллизиях, об этом позаботится диктант Python.

>>> hash('a')
12416037344
>>> hash(12416037344)
12416037344
>>> hash('a') == hash(12416037344)
True
>>> {'a': 'one', 12416037344: 'two'}
{'a': 'one', 12416037344: 'two'}

В этом примере я взял строку и целое число.Но это работает так же с кортежами.Просто понятия не имел, как найти два кортежа с одинаковыми хэшами.

...