确定字典,Python中值的位置

时间:2010-12-13 10:42:17

标签: python dictionary

有一个字典可能包含从0开始的键和值:a,b,c,d,e。每次可以将值分配给不同的键键。字典的大小也可能会改变。

我对两个值感兴趣。我们称他们为b和d。 是否有任何算法可以确定b出现在d之前的情况(即b的密钥小于d's),以及当d出现在b之前时(即d s的密钥小于b)?

5 个答案:

答案 0 :(得分:5)

字典没有订单。因此,你的措辞“b的关键比d'小”是正确的。

现在看起来你可以交换密钥和值......

答案 1 :(得分:1)

如果值是可清除的,那么您可以生成反向字典并检查值。否则,你需要暴力破解它。

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')

答案 2 :(得分:0)

字典是无序的键值对集合。 dict.keys()不需要始终生成相同的输出。你不能用名单做你想做的事吗?

答案 3 :(得分:0)

首先创建词典

>>> 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

答案 4 :(得分:0)

根据您对gnibbler's answer的评论,听起来就像多次出现某个值时,您只关心最早出现的值。在这种情况下,仍然可以使用建议的swapped(value,key)-dictionary,但只需稍加修改即可构建它。

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')

这里有一些细微之处,其分辨率取决于您的特定问题。

  • 如果ab不在index_map,会发生什么?现在我们返回None
  • index_map[a] == index_map[b]会发生什么?从您的评论中可能看起来这可能不会发生在您的情况下,但您应该考虑它。现在我们返回b