2011-06-05 14 views
1

は、私はこのようなテキストを持っていたと言う:選択した文字列の上に2行を表示する方法は?

www.something.com 

get the 2 above 

www.somethingss.com 

get the 2 above 

www.somethingssss.com 

get the 2 above 

たぶん、このような何か:

for a in text: 
    if 'get the 2 above' in a: 
     get 2 above 

私はこれをどのように行うのでしょうか?上記の仮定

+0

はtext'は意味 'です文字列または開いているファイルオブジェクトにするには? –

+0

これは文字列であることを意味します –

+1

この場合、 'for a text in'ループは文字列の文字をループしますが、おそらく' for a text.splitlines() 'を意図しています。 –

答えて

3

は、文字列である:

s = '''www.something.com 

get the 2 above 

www.somethingss.com 

get the 2 above 

www.somethingssss.com 

get the 2 above''' 

s = s.splitlines() 
for i, line in enumerate(s): 
    if 'get the 2 above' in line: 
     print s[i-1], s[i-2] 

s.splitlines()は改行を除去します。あなたがそれらを残したい場合はs.splitlines(True)(感謝Sven Marnach)のようにTrueを渡してください。あなただけのこの操作を行うことができます

ファイルからの行のリストを取得するには、:

with open('myfile.txt', 'r') as f: 
    s = f.readlines() 
+1

そして、 's.splitlines(True)'は行末を保持するので、リストの理解は必要ありません。 –

3

あなたはこのためにあなたのiterable上の固定長「窓」を反復処理するitertoolsレシピを使用することができます。

import itertools 

def windows(iterable, length=2): 
    # If iterable is a list, this is equivalent to 
    # (iterable[i:i+length] for i in range(len(iterable)-length+1)) 
    return itertools.izip(*(itertools.islice(it,n,None) 
       for n,it in enumerate(itertools.tee(iterable,length)))) 

text='''\ 
www.something.com 

get the 2 above 

www.somethingss.com 

get the 2 above 

www.somethingssss.com 

get the 2 above 
'''.splitlines()  

for lines in windows(text,3): 
    if lines[2]=='get the 2 above': 
     print(lines[0]) 

# www.something.com 
# www.somethingss.com 
# www.somethingssss.com 
2

簡単なハック:リストを逆にします。そして、あなたは簡単で、正しい順序で反復している:

lines = iter(reversed(s.splitlines())) 
for line in lines: 
    if <whatever>: 
     next(lines) 
     yield next(lines) 

(EDIT:固定脳おなら、感謝@Sven)

+0

創造的なアプローチのためのボーナスポイント: – conny

+0

'next(次の(行))'は機能しません。これを2つの行に分割する必要があります: 'next(lines);次の(行)を生成する '。 –

0
text = '''www.something0.com 
get the 2 above 

www.somethingss1.com 

get the 2 above 

www.somethingssss2.com 

get the 2 above 



www.somethingss3.com 

get the 2 above 

www.somethingss4.com 
www.somethingss5.com 

get the 2 above''' 

from collections import deque 
above = deque(maxlen=2) 
for x in text.splitlines(): 
    if 'get the 2 above' in x: 
     print above 
    elif x: 
     above.append(x) 


print '\n=================\n' 

# Senderle's code: 

s = text.splitlines() 
for i, line in enumerate(s): 
    if 'get the 2 above' in line: 
     print s[i-1], s[i-2] 

結果

deque(['www.something0.com'], maxlen=2) 
deque(['www.something0.com', 'www.somethingss1.com'], maxlen=2) 
deque(['www.somethingss1.com', 'www.somethingssss2.com'], maxlen=2) 
deque(['www.somethingssss2.com', 'www.somethingss3.com'], maxlen=2) 
deque(['www.somethingss4.com', 'www.somethingss5.com'], maxlen=2) 

================= 

www.something0.com get the 2 above 
www.somethingss1.com 
www.somethingssss2.com 
www.somethingss3.com 
www.somethingss5.com 
+0

郵便番号。 'above = deque(maxlen = 2)'を試してください。 – tzot

+0

@ΤΖωΤΖΙΟΥありがとうございました。私は自分のコードを修正しました - >シンプルで、短く、読みやすい。私はあなたが好きになるあなたの記事の1つを更新します、私は確かに私は1つを見つけるでしょう。私には恥じらいます。私はdeque()の定義を文書で徹底的に読んでいませんでした。 – eyquem

関連する問題