1

レコードリストにないプレーヤー名をここに入力すると、キーエラー例外が発生します。検索して有効な名前を取得することはできますが、他に何かを入力すると、キーエラーが発生します。ファイルの解析から作成された3セットのデータのようなものをすでに処理しているので、これを処理する方法がよくわかりません。

私はこのコードが悪いことを知っています。私はPythonを初めて使用するので、ごちゃごちゃしてください。これは、この機能を動作させるための一種のテストファイルであり、実際のメインファイルの関数に書き込みます。それが理にかなっているなら、ここの一種のテストベッド。

これが私のデータファイルに含まstats4.txtれているものです。

[00000] Cho'Gath - 12/16/3 - Loss - 2012-11-22
[00001] Fizz - 12/5/16 - Win - 2012-11-22
[00002] Caitlyn - 13/4/6 - Win - 2012-11-22
[00003] Sona - 4/5/9 - Loss - 2012-11-23
[00004] Sona - 2/1/20 - Win - 2012-11-23
[00005] Sona - 6/3/17 - Loss - 2012-11-23
[00006] Caitlyn - 14/2/16 - Win - 2012-11-24
[00007] Lux - 10/2/14 - Win - 2012-11-24
[00008] Sona - 8/1/22 - Win - 2012-11-27

これが私のコードです:

import re

info = {}
records = []
search = []
with open('stats4.txt') as data:
    for line in data:
        gameid = [item.strip('[') for item in line.split(']')]
        del gameid[-1]
        gameidstr = ''.join(gameid)
        gameid = gameidstr
        line = line[7:]
        player, stats, outcome, date = [item.strip() for item in line.split('-', 3)]
        stats = dict(zip(('kills', 'deaths', 'assists'), map(int, stats.split('/'))))
        date = tuple(map(int, date.split('-')))
        info[player] = dict(zip(('gameid', 'player', 'stats', 'outcome', 'date'), (gameid, player, stats, outcome, date)))
        records.append(tuple((gameid, info[player])))

print "\n\n", info, "\n\n" #print the info dictionary just to see 
champ = raw_input() #get champion name
#print info[champ].get('stats').get('kills'), "\n\n"
#print "[%s] %s - %s/%s/%s - %s-%s-%s" % (info[champ].get('gameid'), champ, info[champ].get('stats').get('kills'), info[champ].get('stats').get('deaths'), info[champ].get('stats').get('assists'), info[champ].get('date')[0], info[champ].get('date')[1], info[champ].get('date')[2])
#print "\n\n"
#print info[champ].values()

i = 0
for item in records: #this prints out all records
    print "\n", "[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (records[i][0], records[i][1]['player'], records[i][1]['stats']['kills'], records[i][1]['stats']['deaths'], records[i][1]['stats']['assists'], records[i][1]['outcome'], records[i][1]['date'][0], records[i][1]['date'][1], records[i][1]['date'][2])
    i = i + 1

print "\n" + "*" * 50
i = 0
for item in records:
    if champ in records[i][1]['player']:
        search.append(records[i][1])
    else:
        pass
    i = i + 1

s = 0

if not search:
    print "no availble records" #how can I get this to print even if nothing is inputted in raw_input above for champ?


print "****"
for item in search:
        print "\n[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (search[s]['gameid'], search[s]['player'], search[s]['stats']['kills'], search[s]['stats']['deaths'], search[s]['stats']['assists'], search[s]['outcome'], search[s]['date'][0], search[s]['date'][1], search[s]['date'][2])
        s = s + 1

Tryを設定してみました。ある種のことを除いて、無効なプレイヤー名を入力したときに別の結果を得ることができませんでした。名前が存在するかどうかに関係なく、関数を設定して別のものを返すことができると思いますが、少し混乱していると思います。また、一致しない8つのレコードについては、実際には一致しないことに注意してください。ただし、それは私が望んでいる方法ではありません。基本的に、ループ内のレコードにたまたま存在しない有効な入力だけでなく、無効な入力名に対してもそのようなものを取得する必要があります。

このデータの有効な入力名は次のとおりです。Cho'Gath、Fizz、Caitlyn、Sona、またはLux-他のものはキーエラーを生成します。これを処理する必要があるため、エラーは発生せず、代わりに「レコードなし」のように出力されます。そのチャンピオンのために利用可能」(そしてそれを8回ではなく1回だけ印刷する)

助けてくれてありがとう!

[編集]私はついに投稿でこのコードを更新することができました(追加してくれてありがとうmartineau、何らかの理由でバックティックがコードをブロックするように機能しておらず、貼り付けたときに太字の通常のテキストとして表示されていました。とにかく、見てくださいif not search、何も入力されていない場合でも、どうすればそれを印刷できますか?raw_inputでreturnキーを押すだけで、現在****、検索チャンピオンを与えていなくても、すべてのレコードが印刷されます。

4

2 に答える 2

3

正確なエラーはどこで発生していますか?

私はそれがいつであると仮定していますchamp = raw_input() #get champion name

その後info[champ]

キーが最初に存在するかどうかを確認できます

if champ not in info:
  print 'no records avaialble'

または使用するget

if info.get(champ)

または、キーにアクセスしてみてください

try:
  info[champ] 
  # do stuff
except KeyError:
  print 'no records available'

問題を説明したものの、具体的な質問に答えることができれば、具体的な内容は含まれていません。可能な場合は常にトレースバックを含め、リンクではなく投稿に関連するコードを投稿してください。

于 2012-11-28T13:48:14.897 に答える
1

これがあなたの問題に対処すると私が思ういくつかの修正です。また、コードを少し読みやすくするために再フォーマットしました。Pythonでは\、前の行に対になっていない'('または'['がある場合は、aで終了するか、次の行に移動することで、長い行を次の行に続けることができます。

また、ここで質問や回答にコードを入れる方法は、テキストエディターからコードを切り取って編集ウィンドウに貼り付けることです。その後、すべてが選択されていることを確認してから{}、編集の上部にあるツールを使用します。すべてをフォーマットするウィンドウ。

import re
from pprint import pprint

info = {}
records = []
with open('stats4.txt') as data:
    for line in data:
        gameid = [item.strip('[') for item in line.split(']')]
        del gameid[-1]
        gameidstr = ''.join(gameid)
        gameid = gameidstr
        line = line[7:]
        player, stats, outcome, date = [item.strip() for item in line.split('-', 3)]
        stats = dict(zip(('kills', 'deaths', 'assists'), map(int, stats.split('/'))))
        date = tuple(map(int, date.split('-')))
        info[player] = dict(zip(('gameid', 'player', 'stats', 'outcome', 'date'),
                                (gameid, player, stats, outcome, date)))
        records.append(tuple((gameid, info[player])))

#print "\n\n", info, "\n\n" #print the info dictionary just to see
pprint(info)
champ = raw_input("Champ's name: ") #get champion name
#print info[champ].get('stats').get('kills'), "\n\n"
#print "[%s] %s - %s/%s/%s - %s-%s-%s" % (
#       info[champ].get('gameid'), champ, info[champ].get('stats').get('kills'),
#       info[champ].get('stats').get('deaths'), info[champ].get('stats').get('assists'),
#       info[champ].get('date')[0], info[champ].get('date')[1],
#       info[champ].get('date')[2])
#print "\n\n"
#print info[champ].values()

i = 0
for item in records: #this prints out all records
    print "\n", "[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (
                 records[i][0], records[i][1]['player'], records[i][1]['stats']['kills'],
                 records[i][1]['stats']['deaths'], records[i][1]['stats']['assists'],
                 records[i][1]['outcome'], records[i][1]['date'][0],
                 records[i][1]['date'][1], records[i][1]['date'][2])
    i = i + 1

print "\n" + "*" * 50
i = 0
search = []
for item in records:
    if champ in records[i][1]['player']:
        search.append(records[i][1])
    i = i + 1
if not search:
    print "no match"
    exit()

s = 0
for item in search:
        print "\n[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (search[s]['gameid'],
              search[s]['player'], search[s]['stats']['kills'],
              search[s]['stats']['deaths'], search[s]['stats']['assists'],
              search[s]['outcome'], search[s]['date'][0], search[s]['date'][1],
              search[s]['date'][2])
        s = s + 1
于 2012-11-28T14:36:21.110 に答える