2010-10-27 25 views
8

Việc viết vòng lặp và ghi nhớ trước đó là rất phổ biến.Trừ mục hiện tại và trước đó trong danh sách

Tôi muốn một máy phát điện làm điều đó cho tôi. Một cái gì đó như:

import operator 

def foo(it): 
    it = iter(it) 
    f = it.next() 
    for s in it: 
     yield f, s 
     f = s 

Bây giờ trừ cặp đôi.

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 

Đầu ra:

[(0, 3), (3, 4), (4, 10), (10, 2), (2, 3)] 
[3, 1, 6, -8, 1] 
[3, 1, 6, -8, 1] 
  • một tên tốt cho hoạt động này là gì?
  • Cách tốt hơn để viết nội dung này là gì?
  • Có chức năng tích hợp nào tương tự không?
  • Cố gắng sử dụng 'bản đồ' đã không đơn giản hóa nó. Gì vậy?
+0

Danh sách hiểu là đã trivially đơn giản, và đó là cách rõ ràng và tự nhiên để làm được điều này. Đi từ đó đến "bản đồ" mơ hồ hơn nhiều cho thấy bạn đang suy nghĩ quá mức về điều này. Chức năng máy phát điện cũng đã đơn giản và dễ hiểu. –

+0

trông giống như http://en.wikipedia.org/wiki/Bigram, còn gọi là ngram khi n là 2 – sunqiang

Trả lời

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

+1 Tại sao tôi không nghĩ về điều đó. Tôi rất thích nó. –

+1

+1 cho tính đơn giản và tính di động. – Johnsyweb

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

Đầu ra: [3, 1, 6, -8, 1]

+0

Cấu trúc được sử dụng trong câu lệnh in được gọi là "danh sách hiểu". –

4

Recipe from iterools:

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) 

và sau đó:

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

[EDIT]

Ngoài ra, công trình này (Python < 3):

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

+1 cho tên theo cặp và soạn nó bằng cách sử dụng itertools. –

Các vấn đề liên quan