1

特定の番号のサブフィックスを識別するコードを書いています。ifサブフィックスを理解するためのステートメントがたくさんあります。しかし、より洗練された解決策は辞書だと思いました。だから私は以下の辞書を持っています:

問題は、私が書く9 in subfixと、結果がFalseになることです。ディクショナリのタプルの要素にアクセスするにはどうすればよいですか?

 subfix = {(0, 4, 5, 6, 7, 8, 9, 11, 12, 13): 'th', 1: 'st', 2: 'nd', 3: 'rd'}

たとえば、次のような簡単なものを書きたいと思います。

def subf(a):
     if a in subfix:
           ending = subfix.get(a)
     print('We met on the ',a,ending,'.'sep='')

「We met on the 1st.」と表示されます。(ただし、0,4,5,6,7,8,9,11,12,13 では機能しません) これらの要素で機能させるにはどうすればよいですか?

4

5 に答える 5

4

使用している操作が実際に何をするかを知る必要があります。something in some_dictionaryその時点でたまたま必要な「in」テストの任意に定義された概念ではありません。somethingのキーかどうかをテストしますsome_dictionary。はのキーで9ないsubfixので9、でsubfix正しく戻りますFalse

一歩下がって、subfixそれが何をするのか考えてみてください。それはなんのためですか?このような定義では:

subfix = {1: 'st', 2: 'nd', 3: 'rd'}

subfixこれは、数字から各数字の序数バージョンに使用される接尾辞へのマッピングを表していると言えます。OTOHこの定義:

subfix = {(0, 4, 5, 6, 7, 8, 9, 11, 12, 13): 'th', 1: 'st', 2: 'nd', 3: 'rd'}

「共通の序数接尾辞または単一の数を共有する数のタプルからそれらの序数接尾辞へのマッピング」のようなものを表します。この定義が表すものははるかに複雑であるため、それを使用することははるかに複雑です。任意の番号があり、その序数の接尾辞を検索する場合は、それが辞書のキーであるかどうか、または辞書のいずれかのキーの要素であるかどうかを確認する必要があります。つまり、辞書では、番号から序数の接尾辞に直接ジャンプすることはできません。また、マッピングに番号が含まれているかどうかをすばやく確認することもできません。したがって、この場合に使用するのは間違ったデータ構造だと思います。数字から接尾辞への直接マッピングは、はるかに使いやすいでしょう。

于 2012-06-25T01:50:03.857 に答える
4

ハッシュ テーブルとして内部的に実装されているため、ディクショナリは単一のキーを単一の値にマップします。必要な形式の辞書を動的に構築することもできますが、この問題を考える良い代替方法は次のとおりだと思います。

  • 12およびの特殊なケースについては3、辞書の特殊な値を使用します。
  • その他の場合はすべてth、接尾辞として使用します。

幸いなことに、ここで のdefaultパラメーターが役に立ちます。dict.get()

subfix = {1: 'st', 2: 'nd', 3: 'rd'}
def subf(a):
    ending = subfix.get(a, 'th')
    print('We met on the {}{}.'.format(a, ending))

これは、キーがある場合は dict の値を使用し、そうでない場合は を使用しますth

編集:必要な形式を持つ辞書を作成する方法については、次を使用できます。

subfix = { 1: 'st', 2: 'nd', 3: 'rd'}
for k in (0, 4, 5, 6, 7, 8, 9, 11, 12, 13):
    subfix[k] = 'th'

完全を期すためにこれを含めただけであることに注意してください。これはエレガントだとは考えていません。

于 2012-06-25T01:37:52.810 に答える
1

数字を個別にキーとして使用する必要があります。dict を手動で作成するか、次のようにすることができます: どちらが良いかわかりません:

suffixes_list = [
    ((0, 4, 5, 6, 7, 8, 9, 11, 12, 13), "th"),
    ((1,), "st"),
    ((2,), "nd"),
    ((3,), "rd"),
]

suffixes = {}
for nums, suffix in suffixes_list:
    for num in nums:
        suffix[num] = suffix
于 2012-06-25T01:38:43.393 に答える
0

もっとも単純な:

 subfix = {1: 'st', 2: 'nd', 3: 'rd'}
 subfix.get(num, 'th')

getコマンドは、stを1に、ndを2に、rdを3に、thをそれ以外の場合に返します。

もう1つの方法は、タプルを使用することです。ここでは辞書は必要ありません。

subfix = ('','st','nd','rd','th','th','th','th','th','th',)
于 2012-06-25T01:41:54.883 に答える
0

複数キー ディクショナリを、単一のキーを値にマッピングするディクショナリに展開するには:

subfix = subfix((key, value) for key in keys if isinstance(keys, tuple) else (keys,) 
                for keys in subfix.items())

これは、元のデータ構造が良いアイデアであったことを意味するものではないことに注意してください (Ben が言ったように、型が混乱しています) が、これを行う方法、特にネストされたジェネレーター (またはリスト) 内包表記の使用方法を知っておくことも重要です。 .

于 2012-06-25T01:55:19.323 に答える