有一个字典可能包含从0开始的键和值:a,b,c,d,e。每次可以将值分配给不同的键键。字典的大小也可能会改变。
我对两个值感兴趣。我们称他们为b和d。 是否有任何算法可以确定b出现在d之前的情况(即b的密钥小于d's),以及当d出现在b之前时(即d s的密钥小于b)?
答案 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')
这里有一些细微之处,其分辨率取决于您的特定问题。
a
或b
不在index_map
,会发生什么?现在我们返回None
。index_map[a] == index_map[b]
会发生什么?从您的评论中可能看起来这可能不会发生在您的情况下,但您应该考虑它。现在我们返回b
。