2017-01-27 1 views
1

私は、ファイルから読み込まれた次のリストを持っている:films.txtではなく、文字よりも、リスト内の行の中のフィールドへのアクセス

['0,Genre, Title, Rating, Likes', '1,Sci-Fi,Out of the Silent Planet, PG, 0', '2,Sci-Fi,Solaris, PG,0', '3,Sci-Fi,Star Trek, PG, 0', '4,Sci-Fi,Cosmos, PG, 0', '5,Drama, The English Patient, 15, 0', '6,Drama, Benhur, PG, 0', '7,Drama, The Pursuit of Happiness, 12, 0', '8,Drama, The Thin Red Line, 18, 0', '9,Romance, When Harry met Sally, 12, 0', "10,Romance, You've got mail, 12, 0", '11,Romance, Last Tango in Paris, 18, 0', '12,Romance, Casablanca, 12, 0'] 

私は特定のフィールド(すなわち"likes")にアクセスする必要がありますフィルムのインデックス番号に基づいて決定する。例えば

print("PRINT THE CURRENT FILM ROW", allfilms[3]) 
    print("PRINT THE CURRENT LIKES", allfilms[4]) 

のための出力は、次のとおりです。

PRINT THE CURRENT FILM ROW 3,Sci-Fi,Star Trek, PG, 0 
PRINT THE CURRENT LIKES 4,Sci-Fi,Cosmos, PG, 0 

私はしかし、3行目に、0でアクセスしたいどのような。これはインデックス番号に応じて3行目(または2行目)の4番目のフィールドなので、ifまたはloopが必要です。

私が試した:文字ではなく、フィールドを出力

print("PRINT THE CURRENT FILM ROW", allfilms[3][4]) 

を....

i 

それは4番目の文字であるサイファイの「i」の文字を読んでいます...

前述のように、私は4番目のFIELD(0)が必要です。何かご意見は?

def likeafilm(x,username): 
#prompt the user to enter the ID number they require 
    idnumber=int(input("To confirm, please enter the number of the film you wish to like:")) 
    #create a list which stores and displays all the data in the films txt file 
    with open("films.txt",mode="r") as f: 
     allfilms=[] 
     #allfilms=list(csv.reader(allfilms)) - this does not clean the extra spaces so try the next line 
     allfilms=[[x.strip() for x in row] for row in csv.reader(allfilms)] 
     print(allfilms[3]) 
     allfilms[3][4]=str(int(allfilms[3][4])+1) 
     print(allfilms) 

を、それは次のエラー生成します:

は、以下の提案に基づいて、私が試した

print(allfilms[3]) 

はIndexError:範囲

のうちリストインデックスまた、私がする必要が3の代わりにidnumberを使用します(上記の関数のように)

print(allfilms[idnumber]) 

同じエラー:

print(allfilms[idnumber]) 
    IndexError: list index out of range 

答えて

1

基本的に、あなたの配列の各要素は文字列です。 4番目のフィールドがコンマ区切りリストの観点から4番目の要素であることを暗黙的に決定します。 (そしてそれはあまり知られています)あなたのための文字列を分割しcsv.readerオブジェクトに-があるとして、あなたが繰り返すことができ、あなたのリストを渡すことができ、交互に

print("PRINT THE CURRENT FILM ROW", allfilms[3].split(",")[4]) 

必要なのは、この分割をマテリアライズすることです分割された行にあなたのデータの

cr = csv.reader(allfilms) 
for row in cr: 
    print(row[1],row[2],row[4]) 

結果:

Genre Title Likes 
Sci-Fi Out of the Silent Planet 0 
Sci-Fi Solaris 0 
Sci-Fi Star Trek 0 
Sci-Fi Cosmos 0 
Drama The English Patient 0 
Drama Benhur 0 
Drama The Pursuit of Happiness 0 
Drama The Thin Red Line 0 
Romance When Harry met Sally 0 
Romance You've got mail 0 
Romance Last Tango in Paris 0 
Romance Casablanca 0 

ノート、それはデータベースを保持することの最善の方法ではありません、前/後の不要なスペースがあることを私はデモの一部のフィールドを選択しましたコンマを使用することがありますが、アイテムをリストのリストとして保管することをお勧めします。

はこれを説明するために、(0 1に変更)あなたのフォローアップの質問は次のように答えられるでしょう:

allfilms[3] = ",".join(["1" if i==4 else x for i,x in enumerate(allfilms[3].split(","))]) 

は(文字列を再作成が、4指標の上に1と0を変更、あなたが見るように

allfilms = list(csv.reader(allfilms)) 

や余分なスペースの清掃を持つ:

一方、あなたがしなければ非常に簡単ではありません

allfilms = [[x.strip() for x in row] for row in csv.reader(allfilms)] 

あなたはリストのリストを取得します。今:

>>> print(allfilms[3]) 
['3', 'Sci-Fi', 'Star Trek', 'PG', ' 0'] 

とインデックス4を変更するだけで実行します。文字列にキャストバック、追加、intにキャスト

allfilms[3][4] = '1' 

または "増分" に、:で

allfilms[3][4] = str(int(allfilms[3][4])+1) 
+0

allfilms [3] .split( "、")[4])は '0'を生成します。ありがとうございます。しかし、問題は、値を変更する(値を増やす)ためにアクセスする必要があるということです。単なる印刷用ではありません。値を0から+1に変更するために使用するものを知っていますか(現在そのファイルに格納されているものに+1)。 –

+0

私の編集を参照してください。戦略を少し変えるべきです。 –

+0

私は試していました:currentlikes = allfilms [3] .split( "、")[4]#このフィールドから現在の好きなものを取得します。 print(currentlikes) currentlikes = + 1#リスト print(currentlikes) allfilms [3]。split( "、")[4] = currentlikes#それぞれのフィールドで値を0から1に変更しようとしました print(allfilms)#更新されたリストをインクリメントされた+1で3行目、 (0から1) *あなたの編集を通して読んでいただきます、ありがとうございます –

0

をPythonでは、索引付けは文字列オブジェクト内の要素にアクセスするために使用されます。 「フィルム」の文字列のfieldにアクセスするために

In[] : name = 'pythoncarrot' 
In[] : name[3] 
Out[]: 'h' 

は、Pythonインタプリタに明示的に言及する必要があります。 これを実行する方法の1つは、fieldsに文字列をsplitすることです:

In[] : film = '3,Sci-Fi,Star Trek, PG, 0' 
In[] : fields = film.split(',') 
In[] : fields 
Out[]: ['3', 'Sci-Fi', 'Star Trek', ' PG', ' 0'] 

fieldsオブジェクトがタイプlistです。必要なフィールドにはインデックス(この場合は4)でアクセスできます。

In[] : fields[4] 
Out[]: '0' 

したがって、最終的なコードは次のようなものでなければなりません:

all_films = ['0,Genre, Title, Rating, Likes', '1,Sci-Fi,Out of the Silent Planet, PG, 0', '2,Sci-Fi,Solaris, PG,0', '3,Sci-Fi,Star Trek, PG, 0', '4,Sci-Fi,Cosmos, PG, 0', '5,Drama, The English Patient, 15, 0', '6,Drama, Benhur, PG, 0', '7,Drama, The Pursuit of Happiness, 12, 0', '8,Drama, The Thin Red Line, 18, 0', '9,Romance, When Harry met Sally, 12, 0', "10,Romance, You've got mail, 12, 0", '11,Romance, Last Tango in Paris, 18, 0', '12,Romance, Casablanca, 12, 0'] 

for index, film in enumerate(all_films): 
    if index == 3: 
     print(film.split(',')[4]) 

一般的なアドバイス:あなたはそれを変異する場合を除き、listオブジェクト内のデータを保存する(最高のアイデアではないかもしれません; Immutable vs Mutable types)。 listdictを使用してデータを保存するか、またはclass Filmを実装してFilmというオブジェクトのリストを作成することをお勧めします。これにより、迅速かつ簡単にデータを照会することができます。

+0

これを試してみました:indexの場合、列挙するフィルム(allfilms): if index == 3: print(film.split( '、')[4])エラー:print(film.split( '、')[4 ]) IndexError:リストインデックスが範囲外です –

+0

@pythoncarrotこれは私のコンソールで動作しています。あなたはこれについて確信を持っていますか ? –

+0

はい - 印刷のインデント(最後の行)が重要だと思いますか? ....それはあなたが書いた方法です –

関連する問題