2013-10-26 41 views
6

Tuple listemiz var.Tupleların bir listesi üzerinde nasıl arama yapılır?

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

Ve başka listede,

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

Listenin a ikinci tuple öğesinden liste b desen bulmak istiyoruz: Örneğin, ben şu var. Çıktı dönmelidir yukarıdaki örnekte İşte

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

birisi benim hedeflere ulaşmak için bana yardımcı olabilir?

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

üretecek:

+2

Şimdiye kadar neler var? –

+2

Liste a = [('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o') ise; ('bir', 'o'), ('bir', 'o'), ('bir', 'r'), ('kaya', 'h'), ('domuz', 'p')] 'arabayı' keser. Eğer çıktı [['jamy', 'Park', 'kick'), ('jamy', 'rock', 'pig')] 'veya' [('jamy', 'Park', 'kick') olmalıdır.)] ' – Christian

+0

Bu bir gereklilik olup olmadığından emin değilim, ancak kodum 'a', 'h', 'p' ardışık değil olsa bile çalışır. 'A' çiftleri içindeki harfler: khhprgskrfbhevp' ise, khhprgsKrfbHevP'den khp' ile eşleşir, kapaklar hangi harflerin eşleştirildiğini gösterir. –

cevap

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 teşekkürler, hızlı bir cevap oldu. Belki de değişken uzunlukları olabilir ya da bir [x] [0] için – cox

1

, aşağıdaki kod a hep olduğu gibi, düzgün birbirini takip etme 'k','h','p' şekilde içerse bile çalışacak b uzunluğu 3 olduğunu varsayarsak:

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

Kodu:

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

Bu parçacığı deneyin.

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

gibi çalışmalıdır bize söyleyin op bir cazibe çalışmış .. :-) Çok teşekkürler .. – Vysa

+0

'pattern = (' h için çalışmıyor ',' k ',' p ') ' – dawg

+1

@drewk, çünkü desenle eşleşen sıralı değerler yoktur. Kullanıcı, model tuşları arasında rastgele tuşlara izin verilip verilmeyeceğini belirtmedi, ancak bir modelin ** olduğunu belirtti. – 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 

Çıktı: Verilen

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

hedef bazlı listeden a JOIN gruplarını toplamak için ise aynı sırayla olarak meydana gelen İkinci unsur b dizisinde bunu yapabilirsiniz:

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

Bu, ** her durumda deseni takip etmeyecektir!"[" Jamy "," Park "üretecek" list_of_values ​​= [("Park", "h"), ("sıkışmış", "k"), ("kick", "p")] 'i kontrol edin , "tekme")] 'doğru sırada olmasalar bile. – OdraEncoded

+0

@OdraEncoded: Bu ihtiyacı icat ediyorsunuz. Desen listesinin sırasının veya tuplların sırasının çıkış sırasını belirlemesi gerekip gerekmediği belirtilmez. 'Pattern = (' k ',' h ',' p ') '** ve **' list_of_values ​​= [("Park", "h"), ("sıkışmış", "k"), (" tekme "," p ")]' 'nin çıktısı' '('jamy', 'Park', 'kick')]' bana göre doğru görünüyor. – dawg

+0

bir desen. – OdraEncoded

İlgili konular