让我说我有个时间点
dict = {
'9': {'auth': '9', 'duration': 154.92},
'10': {'auth': '10', 'duration': 132.72},
'4': {'auth': '4', 'duration': 144.59}
}我怎样才能用一个新的持续时间数,比如133.92,从dict中得到“秩”值。
它应该返回dict索引1,因为最上面的列表是:Auth-10\x_
133.92大于132.72,但小于144.59或154.92。
如果解释不清楚,我很抱歉,但我尽力了。
编辑:
我再试一次:我需要一个函数,该函数从排序列表/排序列表中返回自定义持续时间的“预测/排名”,并按“DESC/DESC”排序。因此,持续时间为160将返回最后一个位置,即4. (index+1)。120个持续时间应该返回第一个位置,即索引0或1 (index+1)。
发布于 2016-08-29 13:00:27
正如@MartijnPieters所提到的,字典没有索引,但它们确实有键。下面的函数pred() (“前身”的缩写)返回持续时间最大的项的键,该项的持续时间是传递的持续时间的<=。如果传递的持续时间小于字典中的所有持续时间,则返回None (可以测试):
from bisect import bisect_left
def pred(duration, entries):
entries = list(entries.items())
entries.sort(key = lambda x: x[1]['duration'])
durations = [x[1]['duration'] for x in entries]
j = bisect_left(durations,duration)
if j == 0:
return None
else:
return entries[j-1][0]例如,如果
d = {
'9': {'auth': '9', 'duration': 154.92},
'10': {'auth': '10', 'duration': 132.72},
'4': {'auth': '4', 'duration': 144.59}
}(顺便说一句-不要使用dict作为标识符,因为它在Python中具有预定义的含义):
>>> pred(133.92,d)
'10'
>>> pred(149.92,d)
'4'
>>> pred(159.92,d)
'9'
>>> pred(129.92,d)
>>> 请注意,
>>> pred(129.92,d) == None
TrueOn Edit:下面是相同思想的另一个变体,一个返回整数秩:
def rank(duration, entries):
entries = list(entries.items())
durations = sorted(x[1]['duration'] for x in entries)
return bisect_left(durations,duration)然后:
>>> rank(133.92,d)
1
>>> rank(129.92,d)
0Final Edit:以一些可读性为代价,这里有一个1-liner:
def rank(duration, entries):
return bisect_left(sorted(v['duration'] for v in entries.values()),duration)https://stackoverflow.com/questions/39205925
复制相似问题