2015-04-21 21 views
8

İki eşit uzunlukta dizim var ve aynı dizine sahip kelimeleri eşleştirmek istiyorum. Ayrıca, sorun yaşadığım ardışık maçları eşleştirmeye çalışıyorum. Ben Aradıklarım iki dizeyiPython aynı dizine sahip kelimeleri dize ile eşleştirme

alligned1 = 'I am going to go to some show' 
alligned2 = 'I am not going to go the show' 

var Örneğin

sonuç elde etmektir:

['I am','show'] 

Benim şu anki kod aşağıdaki gibidir:

keys = [] 
for x in alligned1.split(): 
    for i in alligned2.split(): 
     if x == i: 
      keys.append(x) 

Hangi bana verir:

['I','am','show'] 

Herhangi bir rehberlik veya yardım takdir edilecektir.

cevap

10

Eşleşen sözcükleri bulmak oldukça basittir, ancak bunları bitişik gruplar halinde koymak oldukça zordur. groupby kullanmanızı öneririz.

import itertools 

alligned1 = 'I am going to go to some show' 
alligned2 = 'I am not going to go the show' 

results = [] 
word_pairs = zip(alligned1.split(), alligned2.split()) 
for k, v in itertools.groupby(word_pairs, key = lambda pair: pair[0] == pair[1]): 
    if k: 
     words = [pair[0] for pair in v] 
     results.append(" ".join(words)) 

print results 

Sonuç:

['I am', 'show'] 
+4

Güzel olmadan iyi görünüyorsun, ama, iş yok etmez. Bu, soruyu cevaplayan tek cevabı! – rickcnagy

+1

Harika cevap! Bir alternatif olarak, ithalat kullanmadan bir yolu düşünebilir misiniz? (Deniyorum) –

+1

Bu harika teşekkür ederim! – GNMO11

3

kodunuzun bir basitleştirme olacaktır:

alligned1 = 'I am going to go to some show' 
alligned2 = 'I am not going to go the show' 

keys = [] 
for i, word in enumerate(alligned1.split()): 
    if word == alligned2.split()[i]: 
     keys.append(word) 
Sonra biz sadece bir kelime eşleşti varsa en bayrak ile yapalım izlemek için ihtiyaç

değişken.

alligned1 = 'I am going to go to some show' 
alligned2 = 'I am not going to go the show' 

keys = [] 
prev = '' 
for i, word in enumerate(alligned1.split()): 
    if word == alligned2.split()[i]: 
     prev = prev + ' ' + word if prev else word 

    elif prev: 
     keys.append(prev) 
     prev = '' 
+2

Bu soruya cevap vermiyor. –

+1

Şimdi kontrol edin, üzgünüm –

+2

'alligned2.split() ile kontrol etmek için bir isntall() [i]' Neden her seferinde ayrıyorsunuz? – thefourtheye

0

Belki çok şık değil, ama işe yarıyor:

from itertools import izip_longest 

alligned1 = 'I am going to go to some show' 
alligned2 = 'I am not going to go the show' 

curr_match = '' 
matches = [] 
for w1, w2 in izip_longest(alligned1.split(), alligned2.split()): 
    if w1 != w2: 
     if curr_match: 
      matches.append(curr_match) 
      curr_match = '' 
     continue 
    if curr_match: 
     curr_match += ' ' 
    curr_match += w1 
if curr_match: 
    matches.append(curr_match) 

print matches 

sonucu:

['I am', 'show'] 
1

Eh Kevin's answer en iyi ve spot on. Bunu zorlu bir şekilde yapmaya çalıştım. Herhangi ithalat

alligned1 = 'I am going to go to some show'.split(' ') 
alligned2 = 'I am not going to go the show'.split(' ') 
keys = [] 
temp = [v if v==alligned1[i] else None for i,v in enumerate(alligned2) ] 
temp.append(None) 
tmpstr = '' 
for i in temp: 
    if i: 
     tmpstr+=i+' ' 
    else: 
     if tmpstr: keys.append(tmpstr) 
     tmpstr = '' 
keys = [i.strip() for i in keys] 
print keys 

Çıktı

['I am', 'show'] 
İlgili konular