三维字典

2024-09-27 09:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

subjects = {
    0:9,'fail': 0,
   9:14, 'pass': 25,
   15:17, 'merit': 40,
    18:20,'Distinction': 50
}

我希望上面的字典包含3个维度。用户输入将介于初始数字之间。根据用户输入的数字,应显示以下消息。4分为不及格,0分为及格,10分为25分,依此类推。在

^{pr2}$

我想让循环要求进入标志爱尔兰等

print sum(subjects[name][value] for name in inputs)

这能做到吗?在


Tags: 用户name消息字典value标志数字pass
3条回答

字典根据键的散列存储其值。在

这意味着字典查找只返回键与查找中使用的键完全匹配的条目。在

你不能让一个键是“3到5范围内的任何数字”而期望找到“4”的查找。在

但是,您可以复制字典条目:

subject_ranges = [(0, 8, 'fail', 0),
                  (9, 14, 'pass', 25),
                  (15, 17, 'merit', 40),
                  (18, 20, 'Distinction', 50)]
subjects = {}
for low, high, descr, points in subject_ranges:
   for score in range(low, high+1):
      subjects[score] = {'description': descr, 'value': points}

然后像这样收集输入:

^{pr2}$

现在,此代码将按您的意愿打印总分:

print sum(subjects[score]['value'] for score in scores)

这不是“三维字典”,也不是类似的东西。这是一个字典,其键是整数,值是两个元素字典(如果需要,可以使用NamedTuple)。但从你的问题来看,你其实并不需要比这更复杂的东西。在

您还可以将值的范围放入元组中,然后这些元组将作为字典的键。(请注意,作为键的列表不起作用,因为它们不可散列。)

In [36]: subjects = {
   ....:     tuple(range(10)): {
   ....:         'descr': 'fail',
   ....:         'points': 0
   ....:     },
   ....:     tuple(range(10, 15)): {
   ....:         'descr': 'pass',
   ....:         'points': 25,
   ....:     },
   ....:     tuple(range(15, 18)): {
   ....:         'descr': 'merit',
   ....:         'points': 40
   ....:     },
   ....:     tuple(range(18, 21)): {
   ....:         'descr': 'Distinction',
   ....:         'points': 50
   ....:     }
   ....: }

然后可以像这样查询字典:

^{pr2}$

你可以使用一个自定义范围字典来查找范围。在

#! /usr/bin/python3.2

class RangeDict (dict):
    class AmbiguityException (Exception): pass

    def __getitem__ (self, key):
        hits = [ (a, b) for a, b in self.keys () if a <= key < b]
        if not hits: {} [key]
        if len (hits) > 1: raise RangeDict.AmbiguityException ()
        #for python3
        return super ().__getitem__ (hits [0] )
        #for python2.7:
        #return super (RangeDict, self).__getitem__ (hits [0] )

subjects = { (0, 9): 'fail',
    (9, 15): 'pass',
    (15, 18): 'merit',
    (18, 21): 'Distinction'}

rd = RangeDict (subjects)
for x in range (21): print (x, rd [x] )

编辑:我没有看到python-2.7的tag。用户super (cls, inst)而不是super ()。在

相关问题 更多 >

    热门问题