-3

これは少し複雑です。他の関数で既に返された txt ファイルを介して作成された 2 つの辞書パラメーターを受け入れる関数があります。countries パラメーターには、3 文字の国コードがキーとして、対応する国が値として含まれます。メダル辞書には 3 文字のコードがキーとして記載されていますが、ゲーム数、金メダル、銀メダル、銅メダルにそれぞれ対応する 4 つの整数を含むセットがあります。関数は、メダル ディクショナリを介して 3 文字の国コード ループを受け入れ、コードがメダル ディクショナリのキーであるかどうかを確認することです。3 つの可能性が考えられます: もしそうなら、次のようにフォーマットされたリストを作成することになっています:[ [‘Country’,’Code’,’Gold’,’Silver’,’Bronze’], [‘Great Britain’ , ‘GRE’ ,800, 400, 750] ]. この部分はコンパイルしてリストを作成しますが、ゲーム部分はメダル キー値から削除し、タプル/セットではなく分岐リストとして返す必要があります。文字列がディクショナリのキーでない場合、文字列が空の場合、上記のフォーマットですべての国をリストに追加します。私はその場でループするのが間違っていると思うので、この部分はコンパイルされていません。文字列が空ではなく、辞書にもない場合は、 を返します[INVALID CODE, n/a]。その部分はうまくいくと確信しています。これが私のコードです:

def findMedals(countries, medals):
    some_strng = input("input a three letter country code and i'll see if I can find it: ")
    reference  = ['Country','Code','Gold','Silver','Bronze']
    medalList= [reference]
    for key in medals.items():
        if some_strng in key:
            medalList.append([countries[some_strng],key,medals[some_strng]])
            break
        if not some_strng in key:
            if some_strng == '':
                medalList.append([countries[some_string], key for key in countries,medals[some_strng] for key in medals])
            else:
                medalList.append(['INVALID CODE', 'n/a'])
    print(medalList)    
    return(medalList)
    findMedals(country('CountryCodes.txt'),medals('GoldMedals.txt'))
4

1 に答える 1

0

これはうまくいくはずです:

def findMedals(countries, medals):
    code = raw_input("input a three letter country code and i'll see if I can find it: ")
    header = ['Country','Code','Gold','Silver','Bronze']
    entry = lambda c: [countries[c], c] + list(medals[c][1:]) # creates one table line
    if code == "":
        # wildcard -> add each line to table
        return [header] + [entry(c) for c in medals if c in countries]
    elif code in countries and code in medals:
        # valid code -> add one line to table
        return [header, entry(code)]
    else:
        # return 'invalid' line
        return [['INVALID CODE', 'n/a']]

countries = {"GER": "Germany", "GBR": "Breat Britain", "USA": "USA", "FOO": "No Medals"}
medals = {"GER": (0,1,2,3), "GBR": (3,4,5,6), "USA": (6,7,8,9)} # tuples, not sets!
res = findMedals(countries, medals)
for line in res:
    print "\t".join(map(str, line))

いくつかのポインタ:

  • あなたのforループは奇妙です。items()つまり、キーだけではなく、キーと値のタプルを反復しています
  • コードがそのタプルにないかどうかを繰り返しごとにチェックしています。つまり、その部分は他の国コードごとに 1 回実行されます。代わりに、コードが辞書のキーであるかどうかを一度だけ確認してくださいin
  • medalsdict はコードを一連の数値にマップするとおっしゃいました。セットは順序付けされていないため、これは機能しません。そのため、どの数字が金メダルで、どの数字が銀メダルであるかなどを判断する方法はありません。代わりにタトルまたはリストを使用してください。
  • medals常に同じコードを保持すると想定していcountriesますが、確認するためにいくつかのチェックを追加しました。
于 2013-07-17T21:11:31.063 に答える