2016-11-08 7 views
1

私は何をしようとしているかに近い私が読んできたいくつかの答えを合成するのに苦労しています。既存の答えを私に教えてください!私はそれが本当にシンプルだが、私は今失っていることを知っている。 this questionに非常に類似し文字列のリストが正確にn回見つかったかどうか確認してください

は、私はしかし、私は唯一の文字列は一度だけにマッチしている行をしたい、私は別のファイルに回の出現タプルに読んだいくつかの文字列を検索します。だからanyall私が言うことができる限り、法案に適合しません。私がこれまで持っているもの

line.countは、行ごとに出現の数字を私に戻って与えている、近いですが、それは2つの方法で間違っている:まず

line.countは、与えられたラインのために何とか1で下にありますか?

私はどのように私が各キーを繰り返し/検索しているか、または== 1テストを使用して何か問題があることを知っていますが、私はそれを理解できません。

私が探している文字列のタプルは次のとおりです。

['AG49', 'AG51', 'AGBD', 'AGHT', 'AGJN', 'AGKC', 'AGNP', 'AGTI', 'LG01', 'LG33', 'LG45'] 

と(彼らは以下のエントリの数十に2から何か(OG_1000を持つことになりますされ、検索するファイルのいくつかの例の行は、実際にあります最長ライン/ほとんどのメンバー):

OG_1000: AG49|00461 AG49|03016 AG49|03395 AG49|01465 AG49|01485 AG49|02179 AG49|02513 AG49|03071 AG49|03396 AG49|02649 AG51|00302 AG51|00779 AG51|01746 AG51|02077 AG51|02502 AG51|01654 AG51|01963 AG51|01965 AGBD|01544 AGBD|02407 AGBD|02722 AGBD|03152 AGBD|02292 AGBD|03607 AGBD|03608 AGBD|03609 AGHT|00130 AGHT|00873 AGHT|00911 AGHT|01291 AGHT|02476 AGHT|02881 AGHT|02477 AGHT|02973 AGHT|02974 AGHT|02975 AGJN|00381 AGJN|00633 AGJN|01876 AGJN|02007 AGJN|02058 AGJN|02059 AGJN|02060 AGJN|02398 AGJN|02399 AGJN|02433 AGJN|02418 AGKC|00658 AGKC|00659 AGKC|00660 AGKC|01985 AGKC|02826 AGKC|02881 AGKC|01323 AGKC|01327 AGKC|01324 AGKC|02267 AGKC|02827 AGKC|02880 AGKC|04269 AGKC|02428 AGNP|00290 AGNP|02833 AGNP|03160 AGNP|03601 AGNP|03987 AGNP|03988 AGNP|03989 AGNP|04108 AGTI|00388 AGTI|01459 AGTI|03163 AGTI|03688 AGTI|00570 AGTI|04026 AGTI|03715 AGTI|03716 AGTI|03717 LG01|00908 LG01|00909 LG01|00910 LG01|01116 LG01|03323 LG01|03588 LG01|03589 LG01|03590 LG01|03591 LG01|01118 LG01|01908 LG01|03182 LG01|03189 LG01|01906 LG33|01192 LG33|01786 LG33|01787 LG33|01973 LG33|03700 LG33|04518 LG33|04759 LG33|01756 LG33|01760 LG33|01971 LG33|02055 LG33|02056 LG33|02057 LG45|00001 LG45|01508 LG45|01643 LG45|00233 LG45|00786 LG45|01599 LG45|01600 LG45|01601 LG45|04210 LG45|04212 LG45|04213 LG45|04637 LG45|03265 LG45|04211 LG45|03255 LG45|03261 AG51|00629 AGKC|04214 AG49|02651 AGBD|01546 AGKC|02430 AGNP|02835 AGTI|01461 LG45|00784 LG33|04104 LG45|00192 LG45|00193 LG33|00381 LG33|01750 
OG_1082: AG49|00880 AG49|02960 AG51|02815 AG51|04137 AGNP|00113 AGNP|03735 AGTI|00006 AGTI|02047 AGBD|01827 AGHT|00357 AGJN|03158 AGKC|02788 LG01|01472 LG33|02682 LG45|01009 
OG_7229: LG33|04676 LG45|01800 

例有効な行は次のようになります。

OG_1264: AG49|00061 AG51|03472 AGBD|01583 AGHT|03015 AGJN|02348 AGKC|00003 AGNP|02702 AGTI|02067 LG01|00073 LG33|02222 LG45|04062 

各文字列は一度だけ出現する。

現時点では私のコード(などを解析マイナスいくつかのオプション):あなたのコードで

# Get a tuple of strings to iterate over 
def getKeys(nameFile): 
    with open(nameFile, "r") as namehandle: 
     names = [] 
      for line in namehandle: 
       strip = line.rstrip('\n') 
      names.append(strip) 

    return names 

# Main code: 
keys = getKeys(nameFile) 

matchedLines = [] 

with open(args.infile, "r") as clusterFile: 
    for line in clusterFile: 
     for key in keys: 
      if line.count(key) == 1: 
       matchedLines.append(line) 
+0

私はあなたのエラーカウントが1である、リスト内の各キーのmatchedLines' 'に追加するのではなく、あなたは、彼らが一度すべての一致している知っているまで待っていると思います。 –

+0

そうですね。私は文字列を一度にテストする方法を熟知しておらず、それぞれを順番にマッチさせてから正しい行を再アセンブルするのではなく、すべての文字列にマッチするようにします。 –

答えて

2

matchedLinesが同じ行を何度もありますし、それはまだあなたのすべてと一致する行を与えるものではありませんキーは一度。そのために、あなたはまだallを使用することができます。

with open(args.infile, "r") as clusterFile: 
    matchedLines = [line for line in clusterFile if all([line.count(key) == 1 for key in keys])] 
+0

完璧!私はどこか理解力があると知っていました! –

関連する問題