1

これは私の最初の投稿であり、プログラミングはまったく新しいので、質問を適切に伝えることができないかもしれませんが、最善を尽くします!

tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}

ub_tries = user input

tries = 1

input ('\nCome on make your ' + tries_dict.get(tries) + guess: ')

これらの3つの要素は、私が作成した数の推測ゲームの一部であり、それぞれの間違った答えの後にwhileループに含めました。tries += 1

ご覧のとおり、私の辞書には、最初の4つの回答のカスタム値と、ゲームが終了する前の最後の可能性があるため、これが私がやろうとしたことです。

「4番目」から「最後」までのすべての回答/キーに「次へ」の値を設定する方法を見つけたかったのです。

のように:

tries = 5

Come on make your next guess

tries = 6

Come on make your next guess

等々

私はいくつかの複雑なループを使用する方法を見つけましたが、好奇心旺盛なタイプであるため、これを達成するためのより効率的で実用的な方法を知りたいと思いました。

これが私が考えたが動作することができなかったいくつかのオプションです:

  1. キーとして範囲を使用する
  2. 4から4の間の値でリストを生成する方法を見つけ、ub_triesそのリストをキーとして使用する

つまり、一般的に言えば、辞書で指定されていないキーに対して、この一般的な答え(次の答えなど)を得る方法をどのように作成できますか?

フィードバックをいただければ幸いです。私の質問はちょっと面倒だと自分に言い聞かせることができるので、遠慮なく説明を求めてください。

プログラミングと関連する質問の両方でもっと巧妙になることを願っています。これまでのところ、私のプログラミングは私の要約スキルとほぼ同じくらい厄介です、ため息をつきます!

4

4 に答える 4

5

これがあなたが望むものであるかどうかはわかりませんdict.getが、答えかもしれません:

>>> ub_tries = 20
>>> tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
>>> tries_dict.get(1, 'next')
'first'
>>> tries_dict.get(4, 'next')
'fourth'
>>> tries_dict.get(5, 'next')
'next'
>>> tries_dict.get(20, 'next')
'last'
>>> tries_dict.get(21, 'next')
'next'

もちろん、さまざまな方法でこれを関数にまとめることができます。例えば:

def name_try(try_number, ub_tries):
    tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
    return tries_dict.get(try_number, 'next')

とにかく、dict.get(key, default=None)は、に似ていますが、がメンバーでないdict[key]場合keyは、を上げる代わりに、をKeyError返しますdefault

あなたの提案について:

キーとして範囲を使用しますか?

もちろん、それは可能です(3ではなくPython 2を使用している場合は、xrangeforを使用してくださいrange)が、どのように役立ちますか?

d = { range(1, 5): '???', 
      range(5, ub_tries): 'next', 
      range(ub_tries, ub_tries + 1): 'last' }

これは完全に合法ですが、はと同じではないため、d[6]を上げることになります。KeyError6range(5, ub_tries)

これを機能させたい場合は、次のRangeDictionaryように作成できます。

class RangeDictionary(dict):
    def __getitem__(self, key):
        for r in self.keys():
            if key in r:
                return super().__getitem__(r)
        return super().__getitem__(key)

しかし、それは「初心者のPython」をはるかに超えており、このひどく非効率的で、不完全で、堅牢ではない実装であっても、私はそれを提案しません。

4からub_triesまでの値を持つリストを生成する方法を見つけ、そのようなリストをキーとして使用する

こういう意味ですか?

>>> ub_tries = 8
>>> tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
>>> tries_dict.update({i: 'next' for i in range(5, ub_tries)})
>>> tries_dict
{1: 'first', 2: 'second', 3: 'third', 4: 'fourth', 5: 'next', 6: 'next', 7: 'next', 8: 'last'}
>>> tries_dict[6]
'next'

それは機能しますが、おそらくそれほど良い解決策ではありません。

最後に、を使用defaultdictできます。これにより、各呼び出しの一部としてデフォルト値を渡す代わりに、デフォルト値をディクショナリにベイクできます。

>>> from collections import defaultdict
>>> tries_dict = defaultdict(lambda: 'next', 
...                          {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'})
>>> tries_dict
defaultdict(<function <lambda> at 0x10272fef0>, {8: 'last', 1: 'first', 2: 'second', 3: 'third', 4: 'fourth'})
>>> tries_dict[5]
'next'
>>> tries_dict
defaultdict(<function <lambda> at 0x10272fef0>, {1: 'first', 2: 'second', 3: 'third', 4: 'fourth', 5: 'next', 8: 'last'})

ただし、これにより、最初に要求したときに各要素が永続的に作成されることに注意してください。デフォルト値を返す関数を作成する必要があります。これにより、値を更新する場合で、開始点としてデフォルトが必要な場合に便利です。

于 2012-11-19T23:27:23.983 に答える
2

範囲をキーとして持つ辞書を使用できます。

def switch(x):
    return { 1<x<4: 'several', 5<x<40: 'lots'}[1]


x = input("enter no. of monsters ")
print switch(x)

お役に立てれば。:)

于 2013-12-20T07:10:46.717 に答える
1

ここでゲームの意図を捉えましたか?

max_tries = 8

tries_verbage = {
    1: 'first',
    2: 'second',
    3: 'third',
    4: 'fourth',
    max_tries: 'last'
    }

for i in xrange(1, max_tries + 1):
    raw_input('Make your %s guess:' % tries_verbage.get(i, 'next'))

戻り値

Make your first guess:1
Make your second guess:2
Make your third guess:3
Make your fourth guess:4
Make your next guess:5
Make your next guess:6
Make your next guess:7
Make your last guess:8
于 2012-11-19T23:27:38.963 に答える
1

リストだけ使ってみませんか?

MAX_TRIES = 10
tries_list = ["first", "second", "third", "fourth"]

for word in (tries_list[:MAX_TRIES-1] + 
             (["next"] * (MAX_TRIES - len(tries_list) - 1)) + ["last"]):
    result = raw_input("Come on, make your {} guess:".format(word))

このコードは計画どおりに機能しないことに注意してください。ただしMAX_TRIES = 0、それが問題になることはないと思います。

于 2012-11-19T23:47:28.233 に答える