2013-10-26 15 views
6

タプルのリストがあります。タプルのリストを検索する方法

a=[('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o'),('an', 
'o'),('an', 'o'),('an', 'r'), ('car', 'k'), ('rock', 'h'), ('pig', 
'p')] 

そして別のリスト、

b = ['k','h','p'] 

私はリストAの第二のタプル要素からリストB内のパターンを発見したいと思います:たとえば、私は次のよう持っています。

ここでは上記の例の出力は返す必要があり、

[('jamy','Park','kick'),('car','rock','pig')] 

誰かが私の目標を達成するために私を助けることができますか?

a=[('test', 'k'), ('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('car', 'k'), 
('an', 'r'),('rock', 'h'), ('see','k'), ('it','h'),('an', 'o'),('works', 'p')] 

b = ['k','h','p'] 

が生成されます。

+2

あなたはこれまでに何を持っていますか? –

+2

リストが 'a = [( 'jamy'、 'k')、( 'Park'、 'h')、( 'kick'、 'p')、( 'an'、 'o' ( ''、 ''、 ''、 ''、 ''、 ''、 ''、 '') 'whitout 'car'タプル。出力が '[( 'jamy'、 'Park'、 'kick')、( 'jamy'、 'rock'、 'pig')]'または ' )] ' – Christian

+0

これが要件であるかどうかは不明ですが、''k '、' h '、' p ''が 'a'で連続していなくてもコードが機能します。 'a 'のペアの文字が' khhprgskrfbhevp'である場合と同様に、 'khhprgsKrfbHevP'の' khp'にマッチし、どの文字がマッチしているかを示します。 –

答えて

1
c = [(a[x][0], a[x+1][0], a[x+2][0]) 
         for x, _ in enumerate(a) 
           if a[x][1] == b[0] and 
            a[x+1][1] == b[1] and 
            a[x+2][1] == b[2]] 
+0

@ありがとう、すばやく答えました。多分、もしbが可変長を持つか、[x] [0]〜 – cox

1

、次のコードは、aは、彼らがいつものように、互いに適切に従わない'k','h','p'ように含まれている場合でも動作しますbの長さが3であると仮定すると:

[('jamy', 'Park', 'kick'), ('see', 'it', 'works')] 

コード:

letters_a = "".join(str(tup[1]) for tup in a) 
letters_b = "".join(str(letter) for letter in b) 
regex = re.compile(r'(%s)[^%s]*(%s)[^%s]*(%s)' 
        % (letters_b[0],letters_b[:2],letters_b[1],letters_b,letters_b[2])) 
#for this example, the above line translates to: 
#regex = re.compile(r'(k)[^kh]*(h)[^khp]*(p)') 
match = re.finditer(regex, letters_a) 

results=[] 
for m in match: 
    first,second,third = m.start(1), m.start(2), m.start(3) 
    results.append((a[first][0],a[second][0],a[third][0])) 

print results 
1

このスニペットを試してください。

list_of_values = [ 
    ('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o'), ('an', 'o'), 
    ('an', 'o'), ('an', 'r'), ('car', 'k'), ('rock', 'h'), ('pig', 'p') 
] 
pattern = ('k','h','p') 

# Important part 
matches = [ 
    values for values, keys in (
     zip(*list_of_values[i:i + len(pattern)]) 
     for i in range(len(list_of_values) - len(pattern) + 1) 
    ) if keys == pattern 
] 

print(matches) 
>> [('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')] 
+0

を参照しなければならないかもしれません。魅力的なもの:-)多くのおかげで.. – Vysa

+0

'pattern =( 'h '、' k '、' p ') ' – dawg

+1

@ drewkです。これは、パターンに一致する逐次値がないためです。ユーザーは、パターンキーの間にランダムキーを許可する必要があるかどうかを指定していませんでしたが、**パターン**と指定しました。 – OdraEncoded

1
a = [('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), 
    ('an', 'o'), ('an', 'o'), ('an', 'o'), ('an', 'r'), 
    ('car', 'k'), ('rock', 'h'), ('pig', 'p')] 

b = ['k', 'h', 'p'] 

filtered = [ele for ele in a if ele[1] in b] 

def split_list(_list, idx_range): 
    _t = [] 
    _temp = [] 
    _d = {idx + 1: ele for idx, ele in enumerate(_list)} 
    for k in _d: 
     if k % idx_range == 0: 
      _t.append(_d[k]) 
      _temp.append(_t) 
      _t = [] 
     else: 
      _t.append(_d[k]) 
    return _temp 

_nested = split_list(filtered, len(b)) 

_l1 = [] 
for outer in _nested: 
    _s = '' 
    for inner in outer: 
     _s += inner[1] 
    _l1.append(_s) 

_l2 = [_nested[idx] for idx, ele in enumerate(_l1) if ''.join(b) == ele] 

final = [] 
for ele in _l2: 
    tup = [e[0] for e in ele] 
    final.append(tuple(tup)) 

print final 

出力:考える

[('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')] 
0

a = [ 
    ('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o'), ('an', 'o'), 
    ('an', 'o'), ('an', 'r'), ('car', 'k'), ('rock', 'h'), ('pig', 'p') 
] 
b = ('k','h','p') 

あなたの目標は、2番目の要素は同じ順序で発生基づいてリストaからタプルのグループを収集する場合bの順序でこれを行うことができます:

result=[] 
for sl in [a[i:i+len(b)] for i in range(0,len(a))]: 
    if tuple([tp[1] for tp in sl])==b: 
     result.append(tuple(tp[0] for tp in sl)) 

print result   
# [('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')] 
+0

これはすべての場合に**パターン**に従わないでしょう!''(jamy ''、 'Park')を生成する 'list_of_values = [(" Park "、" h ")、(" jamy "、" k ")、(" kick "、" p " 、 "キック")] 'のようなものです。 – OdraEncoded

+0

@OdraEncoded:あなたはその要件を発明しています。パターンリストの順序またはタプルのリストが出力の順序を決定する必要があるかどうかは記述されていません。 'pattern =(' k '、' h '、' p ') '**および**' list_of_values = [(Park、h)、(jamy、k) "(" jamy "、" Park "、" kick ")]の出力は私には正しいようです。 – dawg

+0

それはパターンです。 – OdraEncoded

関連する問題