0

Python のクラスを受講しようとしていますが、講師が Google に教えを任せていることがわかりました。2 つのテキスト ファイルを読み取って解析し、データを辞書に保存して比較に使用し、2 つのテキスト ファイルの結果を出力する必要があります。これで、私が何かをしようとしている理由がわかったので、特にやりたいことは、人間の目で読み取れるようにデータのリストを出力することです。現在、印刷時に次のようなリストを受け取ります。

{0: ('Arthur', '3', '1'), 1: ('Lancelot', '0', '0'), 2: ('Robin', '0', '2'), 3: ('Arthur', '0', '3'), 4: ('Lancelot', '2', '0'), 5: ('Robin', '1', '2'),....

このように、行ごとにマップされたデータを持つ 1 つのキー値として、コンソールにこのように表示する必要があります。

  {0: ('Arthur', '3', '1')
   1: ('Lancelot', '0', '0')
   2: ('Robin', '0', '2')
   3: ('Arthur', '0', '3')
   4: ('Lancelot', '2', '0')
   5: ('Robin', '1', '2')
  ....}

どうやら、Googleでこれを見つけるために尋ねる正しい質問がわかりません。フォーマットフラグのような単純なものだと確信しています。これは実際には課題の一部ではありませんが、後でこのプログラムの他の部分の出力をフォーマットする必要があるため、これを行う方法を学びたかったのです。入力として読み取ったテキスト ファイルは次のとおりです。

Arthur;3;1
Lancelot;0;0
Robin;0;2
Arthur;0;3
Lancelot;2;0
Robin;1;2
Robin;2;1
Lancelot;1;1
Galahad;0;1
a random person;0;3
Arthur;1;1
Galahad;1;1
Galahad;3;0

注: 防弾コードを作成する必要はないので、作成しませんでした。不良データやあらゆる種類の例外を考慮する必要はありません。このタイプのテキスト ファイルを処理するだけで済みました。

これが私のコードです:

# readfile(string)
# Purpose: open a text file and iterate though the file, one line at a time.
# Input: string
# Returns: dictionary
def readResponses(filename):
    mapIndex = 0 # used to append to dictionary rows.
    for line in open(filename): # used to iterate through each txt file line.
        if mapIndex < 1:# assign key and tuple data.
            record = {mapIndex: parseForColon(line)} 
            mapIndex += 1
        elif mapIndex > 0: # append key and tuple data
            record.update({mapIndex: parseForColon(line)})
            mapIndex += 1   
    return record

#def readQuestions():


# parseForColon(string)
# Purpose: Parse string data to assign appropriate data to three variables. Slices an input string one char
# qt-a-time until a delimiter is found. Delimiters are disregarded and a tuple is packed into a single variable.
# Input: String - The next line of text
# Returns: a packed tuple
# Called by readResponses(string)
def parseForColon(line): # This function iterates, releases memory, and is called anew from parent function.
        string1, name, = line, "" # needed to receive text file line and slices of that string.
        length = len (line)
        count = 0
        while count < length: # slice the string one char at a time until a delimiter is found.
                if string1[count] == ';':
                        count += 1 # increment past the delimeter and assign next parameter.
                        question = string1[count]
                        count += 2 # increment past the next delimeter and assign last parameter.
                        answer = string1[count]
                        count += 1 #exceed length and break loop.
                        break
                elif string1[count] != ';': # while delimeter not encountered, append first parameter one char at-a-time.
                        name += string1[count]
                        count += 1
        data = name, question, answer
        return data #return tuple.

#parse answers text file and save data to a dictionary. 
answerMap = readResponses("responses.txt")
print answerMap

どんな助けでも大歓迎です。Google や他の人から、クラスで学ぶよりも多くのことを学んでいるようで、イライラします。

4

2 に答える 2

3

pprint書式設定によく似ています。

In [14]: x={0: ('Arthur', '3', '1'), 1: ('Lancelot', '0', '0'), 2: ('Robin', '0', '2'), 3: ('Arthur', '0', '3'), 4: ('Lancelot', '2', '0'), 5: ('Robin', '1', '2')}

In [15]: import pprint

In [16]: pprint.pprint(x)
{0: ('Arthur', '3', '1'),
 1: ('Lancelot', '0', '0'),
 2: ('Robin', '0', '2'),
 3: ('Arthur', '0', '3'),
 4: ('Lancelot', '2', '0'),
 5: ('Robin', '1', '2')}
于 2013-01-21T22:07:52.970 に答える
0

印刷についてはパベルが正しい。あなたの解析は私には複雑すぎるように見えるので、2セントで飛び込みます

>>> from pprint import pprint
>>> s = """Arthur;3;1
... Lancelot;0;0
... Robin;0;2
... Arthur;0;3
... Lancelot;2;0
... Robin;1;2
... Robin;2;1
... Lancelot;1;1
... Galahad;0;1
... a random person;0;3
... Arthur;1;1
... Galahad;1;1
... Galahad;3;0"""
>>> pprint(dict([(n, tuple(l.split(';'))) for n, l in enumerate(s.split('\n'))]))

プログラム全体が1行にあります(明らかに、入力に応じて調整する必要があります。これは単一の文字列であると想定しています)。

基本的に、呼び出しのインデックスをキーとする dict を作成します (これは、リストを反復処理するenumerateと ( ) を生成します。各行の値は aであり、これは分割された各行の値です)による。index, valuetuple;

確かに、最初は少し気が遠くなるかもしれませんが、Python の stdlib の使用方法を本当に理解すると、このような式を読むことはほとんど第二の性質になります。

于 2013-01-21T22:46:31.140 に答える