2013-10-26 13 views
6

Mam listę krotek. Na przykład, mam następujące:Jak wykonać wyszukiwanie na liście krotek

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

a innym liście,

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

chciałbym znaleźć wzór w wykazie B z drugim elementem krotka lista A.

Tutaj w powyższym przykładzie wyjście powinno powrócić,

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

Czy ktoś może mi pomóc, aby osiągnąć swoje cele?

+2

Co masz do tej pory? –

+2

Co się stanie, jeśli lista to "a = [(" jamy "," k "), (" Park "," h "), (" kopnięcie "," p "), (" an "," o "), ("an", "o"), ("an", "o"), ("an", "r"), ("skała", "h"), ("świnia", "p")] 'bez krotki" samochodu ". Jeśli wyjście ma postać '[('jamy', 'Park', 'kick'), ('jamy', 'rock', 'pig')]' lub '[('jamy', 'Park', 'kick')] ' – Christian

+0

Nie wiem, czy jest to wymagane, ale mój kod działa nawet, gdy' 'k ',' h ',' p'' nie są kolejne w' a'. Tak jak w przypadku, gdy litery w parach z 'a' to:' khhprgskrfbhevp', to będzie pasować 'khp' z' khhprgsKrfbHevP', caps oznaczają, które litery są porównywane. –

Odpowiedz

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

@oleg dzięki, była szybka odpowiedź. Może op powinien nam powiedzieć, czy b może mieć zmienną długość, czy powinien odnosić się do [x] [0] do – cox

1

Zakładając, że długość b jest 3, następujący kod będzie działać, nawet jeśli a zawiera 'k','h','p' taki, że nie zawsze następują po sobie poprawnie, na przykład:

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'] 

będzie produkować:

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

Kod:

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

Wypróbuj ten fragment.

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

Pracował jak urok .. :-) Wielkie dzięki .. – Vysa

+0

Nie działa dla 'wzorca = ('h ',' k ',' p ') ' – dawg

+1

@drewk to dlatego, że nie ma żadnych wartości sekwencyjnych pasujących do wzorca. Użytkownik nie określił, czy klucze między wzorami powinny być dozwolone, ale określił, że był to wzór **. – 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 

wyjściowa:

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

Dane:

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') 

Jeśli twoim celem jest zebranie grupy krotek z listy a oparty drugi element występujący w tej samej kolejności co kolejność w b możesz to zrobić:

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

To ** nie ** podąża za wzorem we wszystkich przypadkach!Sprawdź 'list_of_values ​​= [(" Park "," h "), (" jamy "," k "), (" kopnięcie "," p ")]', które wytworzą '[(" jamy "," Park " , "kopnięcie")], nawet jeśli nie są we właściwej kolejności. – OdraEncoded

+0

@OdraEncoded: Wymyślasz to wymaganie. Nie określono, czy kolejność listy wzorów, czy lista krotek powinny określać kolejność wyników. Z 'pattern = ('k', 'h', 'p')' ** i ** 'list_of_values ​​= [(" Park "," h "), (" jamy "," k "), (" kick "," p ")]' wyjście '[(" jamy "," Park "," kopnięcie ")]' wydaje mi się poprawne. – dawg

+0

to wzór. – OdraEncoded

Powiązane problemy