2009-12-10 36 views
16

Tôi mới dùng python và không biết cách tốt nhất để làm điều này.Thêm tuple vào danh sách các bộ dữ liệu bằng Python

Tôi có một danh sách các bộ dữ liệu đại diện cho các điểm và danh sách khác đại diện cho các phần bù. Tôi cần một tập hợp tất cả các kết hợp mà hình thức này tạo thành. Dưới đây là một số mã:

offsets = [(0, 0),(0,-1),(0, 1),(1, 0),(-1, 0)] 
points = [(1, 5),(3, 3),(8, 7)] 

Vì vậy, thiết lập của tôi về điểm kết hợp nên

[(1, 5),(1, 4),(1, 6),(2, 5),(0, 5), 
(3, 3),(3, 2),(3, 4),(4, 3),(2, 3), 
(8, 7),(8, 6),(8, 8),(9, 7),(7, 7)] 

Tôi không thể sử dụng NumPy hoặc bất kỳ thư viện khác.

Trả lời

31
result = [(x+dx, y+dy) for x,y in points for dx,dy in offsets] 

Để biết thêm, hãy xem list comprehensions.

14

Khá đơn giản:

>>> rslt = [] 
>>> for x, y in points: 
...  for dx, dy in offsets: 
...   rslt.append((x+dx, y+dy)) 
... 
>>> rslt 
[(1, 5), (1, 4), (1, 6), (2, 5), (0, 5), (3, 3), (3, 2), (3, 4), (4, 3), (2, 3), (8, 7), (8, 6), (8, 8), (9, 7), (7, 7)] 

Chuyển qua các điểm và hiệu số, sau đó xây dựng bộ dữ liệu mới thêm offsets cho điểm.

4

Nếu bạn không quan tâm đến bản sao trong kết quả:

result = [] 
for ox, oy in offsets: 
    for px, py in points: 
     result.append((px + ox, py + oy)) 

Nếu bạn quan tâm đến bản sao trong kết quả:

result = set() 
for ox, oy in offsets: 
    for px, py in points: 
     result.add((px + ox, py + oy)) 
8

Cá nhân, tôi thích câu trả lời của Alok. Tuy nhiên, cho người hâm mộ của itertools, tương đương với itertools-based (bằng Python 2.6 và mới hơn) là:

import itertools as it 
ps = [(x+dx, y+dy) for (x, y), (dx, dy) in it.product(points, offsets)] 

Tuy nhiên, trong trường hợp này là giải pháp itertools là không nhanh hơn so với một đơn giản (nó thực sự là một chút chậm hơn bởi vì nó cần phải giải nén mỗi x, y nhiều lần cho mỗi lần bù trừ, trong khi cách tiếp cận đơn giản của Alok là mỗi gói x, y nhưng một lần). Tuy nhiên, itertools.product là một sự thay thế tuyệt vời cho các vòng lặp lồng nhau trong các trường hợp khác, vì vậy, nó đáng để biết về nó! -)

+0

Cũng cần lưu ý rằng các hàm kết hợp itertools.product, itertools.permutations và itertools.combinations là mới trong Python 2.6. – musicinmybrain

+0

OK, thực hiện (mặc dù nó rất mệt mỏi để giải thích những gì Python phát hành mỗi tính năng đã được giới thiệu mỗi và mỗi khi bạn đề cập đến bất kỳ tính năng Python ở tất cả, bạn biết! -). –

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