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

上記の辞書に3次元が含まれている必要があります。ユーザー入力は最初の数字の間になります。ユーザーが入力した番号に応じて、次のメッセージが表示されます。例えば。4は0ポイントの失敗、10は25ポイントのパスなどです。

inputs = ['irish','english','french','italian','dutch','german']
for i in range(1, 7):
    inputs.append(raw_input('Enter mark for {}: '.format(i)))

ループにアイルランドなどのエンターマークを要求したい

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

これはできますか?

4

3 に答える 3

4

辞書は、キーのハッシュに基づいてその値を格納します。

つまり、ディクショナリルックアップは、ルックアップで使用されたキーと完全に一致するキーを持つエントリのみを返します

キーを「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}

そして、次のように入力を収集します。

input_names = ['irish','english','french','italian','dutch','german']
scores = []
for i in range(len(input_names)):
    scores.append(int(raw_input('Enter mark for %s: ' % input_names[i])))

これで、このコードは希望どおりに合計スコアを出力するように機能します。

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

これは 3次元辞書」でも、それに類するものでもありません。これは、キーが整数で、値が2要素の辞書である辞書です(必要に応じてNamedTupleを使用できます)。しかし、あなたの質問から、これよりも洗練されたものが実際に必要だったようには見えません。

于 2013-01-08T21:25:22.013 に答える
2

値の範囲をタプルに入れることもでき、これらのタプルは辞書のキーとして機能します。(キーとしてのリストはハッシュ可能ではないため、機能しないことに注意してください。)

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
   ....:     }
   ....: }

次に、次のように辞書をクエリできます。

In [43]: score = 0

In [44]: vals = [5, 15, 20, 2, 12]

In [45]: for val in vals:
   ....:     for key in subjects:
   ....:         if val in key:
   ....:             score += subjects[key]['points']
   ....:             print subjects[key]['descr']
   ....:             break 
fail
merit
Distinction
fail
pass

In [46]: score
Out[46]: 115
于 2013-01-08T21:53:53.700 に答える
1

範囲を検索するカスタム範囲辞書を使用できます。

#! /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タグを見ませんでした。super (cls, inst)の代わりにユーザーsuper ()

于 2013-01-08T22:20:48.103 に答える