2016-03-25 6 views
1

名前または電話番号を入力したり、ファイルに存在するかどうかを確認したり、印刷物であるかどうかを確認する関数を記述しようとしていますその要素が見つかった行全体を削除します。 、nameSearch ==ジョーのであれば、出力はJoe;Bloggs;[email protected];0719451625行の一部がPythonで見つかった場合にファイルから行を印刷

任意の助けをいただければ幸いである必要があり

Joe;Bloggs;[email protected];0719451625 
Sarah;Brown;[email protected];0749154184 

ありがとう:ファイルがそうのようにフォーマットされ

def searchPlayer(): 
    with open("players.txt") as f: 
     data = f.readlines() 
     print "Enter 0 to go back" 
     nameSearch = str(raw_input("Enter player surname, forname, email, or phone number: ")) 

     if any(nameSearch in s for s in data): 
      #Finding the element in the list works 
      #Can't think of a way to print the entire line with the player's information 
     else: 
      print nameSearch + " was not found in the database" 

:私はこれまで持っています

+1

問題は、 'any(...)'は、どの行がマッチしたかを教えてくれないということです。ループに解凍して、それを簡単に実行できます。 – alexis

答えて

2

なぜループを使用しないのですか?

for s in data: 
    if nameSearch in s: 
     print s 
     break 

anydocsから、とにかくループしている:

def any(iterable): 
    for element in iterable: 
     if element: 
      return True 
    return False 
+0

ループしますが、短絡します(ループに 'break'を追加して同等のものにする必要があります)。そして、CPython(リファレンスインタープリタ)ではC言語で実装されています。ループを綴ったもちろん、あなたが必要とすることをしなければ役に立たない。 :-) – ShadowRanger

+0

あなたは正しく編集されています - 私は何とか返品を忘れてしまいました。私はあなたにも 'return print(s) – Bahrom

1

はちょうどコメントで述べた@alexisたよう

with open("players.txt") as f: 
    for line in f: 
    if nameSearch in line: 
     print line 
0

を行い、あなたがany()を使用しないでください、あまりにも複雑に思えますどの行が一致しているか知りたい場合あなたは、最初の一致を印刷break前にハッシュ記号を取り出し、else:if not found:を変更したい場合は

found = False 
for s in data: 
    if nameSearch in s: 
     print s 
     found = True 
     #break # Optional. Put this in if you want to print only the first match. 

if not found: 
    print "{} was not found in the database".format(nameSearch) 

:この場合は、あなたの代わりにループを使用する必要があります。

1

他の人が触れたようにanyは使用できませんが、よりコンパクトなコードを保持したい場合はnextを使用できます。代わりに:

entry = next((s for s in data if nameSearch in s), None) 
if entry is not None: 
    print entry, 
else: 
    print nameSearch, "was not found in the database" 

注:

if any(nameSearch in s for s in data): 

あなたはnext with a default valueを使用すると思いますが、データのフォーマットを間違えてしまうそうでないとしてあなたが、ここで解析するcsv.readerなどを使用する場合があります。ユーザーが;と入力すると、フィールドデータではなく;がフォーマットされていても、最初のレコードが盲目的に返されます。同様に、Jonの検索では、JonまたはJonathanという名前の最初の人物、またはJonで始まる可能性のある他の名前を見つけることができます。

関連する問題