-4

私には深刻な問題がある宿題があります。重要なのは、各行をタプルにし、これらのタプルをリストにすることです。のようにlist=[tuple(line1),tuple(line2),tuple(line3),...]。その上、カンマで区切られた多くの文字列があります。"aei","1433","lincoln",...

質問は次のとおりです。

本は、著者の lastName、著者の firstName、タイトル、日付、および ISBN のタプルとして表すことができます。

  • readBook()この情報を含むカンマ区切りの文字列を指定すると、本を表すタプルを返す関数 を作成します。

  • readBooks()本ごとにコンマ区切りの 1 行を含むテキスト ファイルの名前を指定すると、readBook()タプルのリストを返すために使用する関数を記述します。タプルのそれぞれが 1 本の本を記述します。

  • buildIndex()によって返された本のリストを指定して、readBooks()キーワードから本のタイトルへのマップを作成する関数 を作成します。キーワードは、書籍のタイトルに含まれる「a」、「an」、または「the」を除く任意の単語です。

これが私のコードです:

RC=("Chann", "Robbbin", "Pride and Prejudice", "2013", "19960418")
RB=("Benjamin","Franklin","The Death of a Robin Thickle", "1725","4637284")
def readBook(lastName, firstName, booktitle, date, isbn):
    booktuple=(lastName, firstName, booktitle, date, isbn)
    return booktuple
# print readBook("Chen", "Robert", "Pride and Prejudice", "2013", "19960418")

def readBooks(file1):
    inputFile = open(file1, "r")
    lines = inputFile.readlines()
    book = (lines)
    inputFile.close()
    return book
print readBooks("book.txt")
BooklistR=[RC,RB]

def buildIndex(file2):
    inputFile= open("book.txt","r")
    Blist = inputFile.readlines()
    dictbooks={}
    for bookinfo in Blist:
        title=bookinfo[2].split()
        for infos in title:
            if infos.upper()=="A":
                title.remove(infos)
            elif infos.upper()=="THE":
                title.remove(infos)
            elif infos.upper()=="AN":
                title.remove(infos)
            else:
                pass
        dictbooks[tuple(title)]= bookinfo[2]
    return dictbooks
print buildIndex("book.txt")

#Queries#
def lookupKeyword(keywords):
    dictbooks=buildIndex(BooklistR)
    keys=dictbooks.viewkeys()
    values=dictbooks.viewvalues()
    for keybook in list(keys):
        for keyw in keywords:
            for keyk in keybook:
                if keyw== keyk:
                    printoo= dictbooks[keybook]
                else:
                    pass
    return printoo
print lookupKeyword("Robin")
4

2 に答える 2

2

このようなものの何が問題になっていますか?:

with open(someFile) as inputFile:
    myListofTuples = [tuple(line.split(',')) for line in inputFile.readlines()]

[ロバートのコメントに基づいて説明を追加]

with最初の行は、ステートメントでファイルを開きます。Pythonwithステートメントはかなり新しい機能であり、かなり高度です。コードが実行されるコンテキストをセットアップすると、Python エンジンがそのコンテキストを終了するときに、クリーンアップおよびファイナライズ コードがどのように実行されるかについて、一定の保証があります (作業を完了するか、未処理の例外に遭遇するかによって)。

醜い詳細については、Python Docs: Context Managersで読むことができますが、すべての要点は、コードの実行がそのコンテキストを離れた後に適切に閉じられることを保証してsomeFileを開いていることです (これは、with何らかのエラーが発生した場合や、そのスイート内のコードでキャッチに失敗した例外が発生した場合でも実行されます。

この場合、as句を使用して、開いているファイル オブジェクトを参照できるローカル名を指定します。(ファイル名は単なる文字列であり、open()組み込み関数に引数として渡されます...その関数によって返されるオブジェクトには、参照できる名前が必要です。これは、for i in whateverステートメントが各アイテムをバインドする人に似ていますループi介した各反復の名前に関係なく。

一連のwithステートメント (コンテキスト マネージャーのコンテキスト内で実行されるインデントされたステートメントのセット) は、単一のステートメント ... name にバインドされたリスト内包表記で構成されますmyListofTuples

リスト内包表記は、もう 1 つのかなり高度なプログラミング概念です。それらをさまざまな方法で実装する非常に高水準の言語が多数あります。Python の場合、それらはステートメントよりもはるかに古いバージョンにさかのぼりますwith--- 2.2 かそこらの時間枠で導入されたと思います。

その結果、リスト内包表記は Python コードではかなり一般的ですが、withステートメントはゆっくりと採用されています。

Python のリスト リテラルは次のようになります。[something, another_thing, etc, ...]リスト内包表記は似ていますが、項目リテラルのリストを式 (リストに評価されるコード行) に置き換えます。例:[x*x for x in range(100) if x % 2]は、1 から 99 までの奇数の 2 乗である整数のリストに評価されるリスト内包表記です。 (リスト内包表記にはカンマがないことに注意してください。リストリテラルで使用されています)。

私の例for line in inputFile.readlines()では、式のコアとして を使用しており、それらのそれぞれを共通の ( line.split(',')) で分割し、結果のリストを に変換していtuple()ます。

これは非常に簡潔な言い方です:

myListofTuples = list()
for line in inputfile.readlines():
    myListofTuples.append(line.split(','))
于 2013-07-19T03:51:00.493 に答える
0

考えられるプログラムの 1 つ:

import fileinput

def readBook(str):
    l = str.split(',')
    t = (l[0:5])
    return t

#b = readBook("First,Last,Title,2013,ISBN")
#print b

def readBooks(file):
    l = []
    for line in fileinput.input(file):
        t = readBook(line)
        # print t
        l.append(t)
    return l

books = readBooks("data")

#for t in books:
#    for f in t:
#        print f

def buildIndex(books):
    i = {}
    for b in books:
        for w in b[2].split():
            if w.lower() not in ('a', 'an', 'the'):
                if w not in i:
                    i[w] = []
                i[w].append(b[2])
    return i

index = buildIndex(books)

for w in sorted(index):
    print "Word: ", w
    for t in index[w]:
        print "Title: ", t

サンプル データ ファイル (コードでは「データ」と呼ばれます):

Austen,Jane,Pride and Prejudice,1811,123456789012X
Austen,Jane,Sense and Sensibility,1813,21234567892
Rice-Burroughs,Edgar,Tarzan and the Apes,1911,302912341234X

出力例:

Word:  Apes
Title:  Tarzan and the Apes
Word:  Prejudice
Title:  Pride and Prejudice
Word:  Pride
Title:  Pride and Prejudice
Word:  Sense
Title:  Sense and Sensibility
Word:  Sensibility
Title:  Sense and Sensibility
Word:  Tarzan
Title:  Tarzan and the Apes
Word:  and
Title:  Pride and Prejudice
Title:  Sense and Sensibility
Title:  Tarzan and the Apes

データ形式は、コンマが埋め込まれているため、「ライオン、魔女、ワードローブ」などの本のタイトルをサポートできないことに注意してください。ファイルが文字列を引用符で囲んだ CSV 形式の場合は、それを管理できます。

それが完全に最小限のPythonicコードであるかどうかはわかりませんが(まったくわかりません)、要件を満たしているようです。

于 2013-07-19T05:38:09.627 に答える