2010-10-27 27 views
8

Bir döngü yazmak ve öncekileri hatırlamak çok yaygındır.Bir listedeki mevcut ve önceki öğenin çıkarılması

Bunu benim için yapan bir jeneratör istiyorum. Şu gibi bir şey: çift-çifti çıkarınız.

L = [0, 3, 4, 10, 2, 3] 

print list(foo(L)) 
print [x[1] - x[0] for x in foo(L)] 
print map(lambda x: -operator.sub(*x), foo(L)) # SAME 

Çıkışlar:

[(0, 3), (3, 4), (4, 10), (10, 2), (2, 3)] 
[3, 1, 6, -8, 1] 
[3, 1, 6, -8, 1] 
  • bu işlem için iyi bir adı nedir?
  • Bunu yazmanın daha iyi bir yolu nedir?
  • Benzer bir şey yapan yerleşik bir işlev var mı?
  • 'map' kullanmayı denemek, onu basitleştirmedi. Nedir?
+0

liste anlama zaten trivially basittir ve bunu yapmak için bariz ve doğal yolu:Ayrıca, bu (Python < 3) çalışır. Bundan çok daha karanlık olan 'haritayı' görmek, bunu gözden kaçırdığınızı gösteriyor. Jeneratör işlevi de zaten basit ve basittir. –

+0

http://en.wikipedia.org/wiki/Bigram, n = 2 olduğunda ngram gibi görünüyor. – sunqiang

cevap

21
[y - x for x,y in zip(L,L[1:])] 
+2

+1 Neden bunu düşünmedim. Onu çok severim. Sadelik ve taşınabilirlik için –

+1

+1. – Johnsyweb

4
l = [(0,3), (3,4), (4,10), (10,2), (2,3)] 
print [(y-x) for (x,y) in l] 

Çıkışlar: [3, 1, 6, -8, 1]

+0

Baskı ifadesinde kullanılan yapıya "liste kavraması" denir. Çifti adı için itertools kullanarak –

4

Recipe from iterools: o

from itertools import izip, tee 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

ve:

>>> L = [0, 3, 4, 10, 2, 3] 
>>> [b - a for a, b in pairwise(L)] 
[3, 1, 6, -8, 1] 

[DÜZ]

>>> map(lambda(a, b):b - a, pairwise(L)) 
+0

+1. –

İlgili konular