2016-07-25 4 views
0

私は検索したいサブストリングの大きなリストを持っており、2つの特定のサブストリングが連続して見つかるかどうかを調べます。論理は最初のシーケンスを探し、それが見つかった場合は2番目のサブストリングを調べ、すべての一致を返します(16文字シーケンスの最初の15文字に基づいています)。最初のシーケンスが見つからない場合は、2番目のシーケンスのみを検索し、最後に見つからなければゼロになります。マッチはリストに追加され、さらに処理されます。次のように使用される現在のコードは次のとおりです。サブストリングのリストの検索は、一度に複数の条件を返します

dataA = ['0100101010001000', 
'1001010100010001', 
'0010101000100010', 
'0101010001000110', 
'1010100010001110', 
'0101000100011100', 
'1010001000111010', 
'0100010001110100', 
'1000100011101000', 
'0001000111010000'] 
A_vein_1 = [0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,0] 
joined_A_Search_1 = ''.join(map(str,A_vein_1)) 
print 'search 1', joined_A_Search_1 
A_vein_2 = [1,0,0,1,0,1,0,1,0,0,0,1,0,0,0] 
joined_A_Search_2 = ''.join(map(str,A_vein_2)) 
match_A = [] #empty list to append closest match to 
#Match search algorithm 
for i,text in enumerate(data): 
    if joined_A_Search_1 == text: 
     if joined_A_Search_2 == data[i+1][:-1]: 
      print 'logic stream 1' 
      match_A.append(data[i+1][-1]) 
    if joined_A_Search_1 != text: 
     if joined_A_Search_2 == text[:-1]: 
      print 'logic stream 2' 
      #print 'match', text[:-1] 
      match_A.append(text[-1]) 
print ' A matches', match_A 
try: 
    filter_A = max(set(match_A), key=match_A.count) 
except: 
    filter_A = 0 
    print 'no match A' 
filter_A = int(filter_A) 
print '0utput', filter_A 

問題は、このケースでは、私は実際にそれが厳格どちらか一方になりたいときに私は、ロジック・ストリーム1と論理ストリーム2の両方のリターンを得ることです唯一の論理ストリーム1は、出力の例は次のようになります。リストが短縮されており、データ入力を直接に置換された、同様の目的のためにプリントアウト:

search 1 0100101010001000 
search 2 100101010001000 
logic stream 1 
logic stream 2 
logic stream 1 
logic stream 2 
logic stream 2 

(注この投稿とエラートラッキング)

答えて

0

あなたのコードは私を混乱させる。

#!/usr/env/env python 

dataA = ['0100101010001000', 
'1001010100010001', 
'0010101000100010', 
'0101010001000110', 
'1010100010001110', 
'0101000100011100', 
'1010001000111010', 
'0100010001110100', 
'1000100011101000', 
'0001000111010000'] 
A_vein_1 = [0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,0] 
A_vein_2 = [1,0,0,1,0,1,0,1,0,0,0,1,0,0,0] 

av1_str = "".join(map(str,A_vein_1)) 
av2_str = "".join(map(str,A_vein_2)) 

for i, d in enumerate(dataA): 
    if av1_str in d: 
     print av1_str, 'found in line', i 
    elif av2_str in d: 
     print av2_str, 'found in line', i 

これは私与える::しかし、私はあなたの問題を理解すると思う

[email protected]:~/code/python/stack_overflow$ python find_str.py 
0100101010001000 found in line 0 
100101010001000 found in line 0 
100101010001000 found in line 1 

のelifに編集した後:

[email protected]:~/code/python/stack_overflow$ python find_str.py 
0100101010001000 found in line 0 
100101010001000 found in line 1 
+0

このコードの目的は、その不足している最後の数字は、第二の配列(一番下に、したがって最大カウントコード)のためにあるものを見つけることです。両方の論理ストリームがリストfilter_Aに寄与すると、精度は失われる。それが厳密に1つのケースまたは他のものを必要とする理由である。私はそれが必要な論理のORゲートタイプと考えることができると思います。 – paperstsoap

0

入力:

dataA = ['0100101010001000', 
'1001010100010001', 
'0010101000100010', 
'0101010001000110', 
'1010100010001110', 
'0101000100011100', 
'1010001000111010', 
'0100010001110100', 
'1000100011101000', 
'0001000111010000'] 
A_vein_1 = [0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,0] 
A_vein_2 = [1,0,0,1,0,1,0,1,0,0,0,1,0,0,0] 

コード:

av1_str = "".join(map(str,A_vein_1)) 
av2_str = "".join(map(str,A_vein_2)) 

y=[av1_str,av2_str] 

print [(y,dataA.index(x)) for x in dataA for y in dataB if y in x] 

出力:

[('0100101010001000', 0), ('100101010001000', 0), ('100101010001000', 1)] 
関連する問題