Определить положение значений в словаре Python - PullRequest
0 голосов
/ 13 декабря 2010

Существует словарь, который может включать ключи, начинающиеся с 0, и значения: a, b, c, d, e.Каждый раз значения могут быть назначены различным клавишам клавиш.Размер словаря также может измениться.

Меня интересуют два значения.Давайте назовем их б и д.Есть ли алгоритм, который определяет ситуации, когда b появляется раньше, чем d (т. Е. Ключ b меньше, чем d), и когда d появляется раньше, чем b (т. Е. Ключ d меньше, чем b)?

Ответы [ 5 ]

5 голосов
/ 13 декабря 2010

В словаре нет порядка.Таким образом, ваша формулировка «ключ b меньше чем d» является правильной.

Теперь, похоже, вы могли бы поменять местами ключи и значения ...

1 голос
/ 13 декабря 2010

Если значения могут быть хешируемыми, вы можете создать обратный словарь и проверить значения.В противном случае вам понадобится перебор.

def dictfind(din, tsent, fsent):
  for k in sorted(din.iterkeys()):
    if din[k] == tsent:
      return True
    if din[k] == fsent:
      return False
  else:
    raise ValueError('No match found')

D = {0:'a', 1:'b', 2:'c', 3:'d', 4:'e'}

print dictfind(D, 'b', 'd')
0 голосов
/ 21 января 2011

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

xs = {0: 'a', 1: 'b', 2: 'a'}
ys = {}
for k, v in xs.iteritems():
    if v not in ys or k < ys[v]:
        ys[v] = k

Затем вы можете определить функцию, которая сообщит вам, какой из двухзначения отображаются в меньший индекс:

def earlier(index_map, a, b):
    """Returns `a` or `b` depending on which has a smaller value in `index_map`.

    Returns `None` if either `a` or `b` is not in `index_map`.

    """
    if a not in index_map or b not in index_map:
        return None

    if index_map[a] < index_map[b]:
        return a

    return b

Использование:

print earlier(ys, 'a', 'b')

Здесь есть некоторые тонкости, решение которых зависит от вашей конкретной проблемы.

  • Чтодолжно произойти, если a или b не в index_map?Прямо сейчас мы возвращаем None.
  • Что должно произойти, если index_map[a] == index_map[b]?Из ваших комментариев это звучит так, как будто это может не произойти в вашем случае, но вы должны рассмотреть это.Прямо сейчас мы возвращаем b.
0 голосов
/ 13 декабря 2010

Сначала создайте свой словарь

>>> import random
>>> keys = range(5)
>>> random.shuffle(keys)
>>> d=dict(zip(keys, "abcde"))
>>> d
{0: 'd', 1: 'c', 2: 'e', 3: 'b', 4: 'a'}

Теперь создайте словарь, используя ключи d в качестве значений и значения d в качестве ключей

>>> rev_d = dict((v,k) for k,v in d.items())

Ваши сравнения теперь просто обычные поиски по словарю

>>> rev_d['b'] > rev_d['d']
True
0 голосов
/ 13 декабря 2010

Словари - это неупорядоченные наборы пар ключ-значение.dict.keys() не обязательно производить одинаковый вывод всегда.Разве вы не можете делать то, что вы хотите со списками?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...