3

小文字に変換する必要があるこの Python 辞書があります。ディクショナリは、大文字と小文字を区別しない入力に対応する必要があるデータで構成されます。たとえば、resp = 'GBR' または 'gbr' で機能します。私がここで意味を成していることを願っています。どんな助けでも大歓迎です!

resp = raw_input('Which country is ' + record['name'] + ' in? ')
        print " "
        valid = {'GBR': ['GBR',
                        'United Kingdom',
                        'UK',
                        'Great Britain and Northern Island',
                        'GB'
                        ],
                'IRL': ['IRL',
                        'Eire',
                        'Republic of Ireland'
                        ]
            }
        if resp in valid[record['sov']]:
            answ = 'Yes, ' + record['name'] + ' is in the ' + resp
4

3 に答える 3

5

大文字と小文字を区別しない入力に対応する必要がある場合.lower()は、そのためだけに 2 つ目の辞書を作成/変換するのではなく、入力と辞書の値を比較するときに呼び出しを追加することをお勧めします。

ただし、辞書がすでに大文字に.upper()なっている場合は、入力を大文字に変換して辞書に一致させるようにします。逆にするのではなく、

于 2012-10-27T17:25:02.487 に答える
1

基本的に、応答の小文字バージョンと正解の小文字バージョンを比較します。

しかし、あなたの質問から完全に明確ではないことがいくつかあります。

正確には何に保存していrecordsますか?「はい、... は ... にあります」という確認でどの国名を使用する必要がありますか? ユーザーの応答を有効な類義語のリストと突き合わせたいと思いますよね?

シティ ポップ クイズ ゲームを書くとしたら、おそらく次のようにします。

import random

cities = {'Dublin': 'IRL',
          'London': 'GBR',
          }

country_synonyms = {'GBR': ['United Kingdom',
                            'GBR',
                            'UK',
                            'Great Britain and Northern Island',
                            'GB',
                            ],
                    'IRL': ['Republic of Ireland',
                            'IRL',
                            'Eire',
                            ]
                    }

# Pick a random city from our dicts' keys
challenge = random.choice(cities.keys())

# Country code of the correct response, e.g. 'GBR'
correct_cc = cities[challenge]

# Assume the canonical name for a country is first in the list of synonyms
correct_name = country_synonyms[correct_cc][0]

response = raw_input('Which country is %s in? ' % challenge)

# Clean any whitespace
response = response.strip()

lowercase_synonyms = [s.lower() for s in country_synonyms[correct_cc]]

if response.lower() in lowercase_synonyms:
    answer = "Yes, %s is in the %s." % (challenge, correct_name)
else:
    answer = "Sorry, that's wrong. %s is in the %s." % (challenge, correct_name)

print answer

この行

lowercase_synonyms = [s.lower() for s in country_synonyms[correct_cc]]

リスト内包表記を使用して、リスト内のすべての文字列country_synonyms[correct_cc]を小文字に変換します。別の代替手段は、次を使用することmapです。

import string
# ...
lowercase_synonyms = map(string.lower, country_synonyms[correct_cc])

string.lowerこれにより、関数がリスト内のすべての項目にマップされますcountry_synonyms[correct_cc]

于 2012-10-27T18:10:14.057 に答える
0

他の回答はそれを行う適切な方法を示していますが、辞書を小文字に変換したい場合、これが最も簡単ですが最も効果的な方法ではありません:

>>> import ast
>>> d
{'GBR': ['GBR', 'United Kingdom', 'UK', 'Great Britain and Northern Island', 'GB'], 'IRL': ['IRL', 'Eire', 'Republic of Ireland']}
>>> ast.literal_eval(str(d).lower())
{'gbr': ['gbr', 'united kingdom', 'uk', 'great britain and northern island', 'gb'], 'irl': ['irl', 'eire', 'republic of ireland']}

編集:evalのグローバル引数。

編集 2: 安全な「literal_eval」の使用:

これは、値を自分で解析する必要なく、信頼できないソースからの Python 式を含む文字列を安全に評価するために使用できます。

于 2012-10-27T18:16:06.240 に答える