2009-04-16 29 views
11

Cách tốt nhất để chia tách điều này là gì:Tuple nhiều đến hai cặp Tuple bằng Python?

tuple = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') 

vào đây:

tuples = [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')] 

Giả sử rằng đầu vào luôn có số giá trị bằng nhau.

+7

Bạn có thể không muốn một biến có tên tuple vì nó ghi đè chức năng tuple dựng sẵn(). – recursive

Trả lời

36

zip() là bạn của bạn:

t = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') 
zip(t[::2], t[1::2]) 
+0

Thay thế tuyệt vời! –

+1

+1 vì nó đẹp và tôi không biết về cú pháp [::] –

+0

không hoạt động đối với tuple = ('a', 'b', 'c', 'd', 'e', ​​'f ',' g ',' h ',' i ') # lưu ý' i 'cuối cùng, làm cho các tuples có độ dài lẻ – dfa

15
[(tuple[a], tuple[a+1]) for a in range(0,len(tuple),2)] 
+0

+1 sử dụng rõ ràng hơn chức năng phạm vi –

-1

Dưới đây là một công thức chung cho bất kỳ kích thước đoạn, nếu nó có thể không phải lúc nào 2:

def chunk(seq, n): 
    return [seq[i:i+n] for i in range(0, len(seq), n)] 

chunks= chunk(tuples, 2) 

Hoặc, nếu bạn thích lặp :

def iterchunk(iterable, n): 
    it= iter(iterable) 
    while True: 
     chunk= [] 
     try: 
      for i in range(n): 
       chunk.append(it.next()) 
     except StopIteration: 
      break 
     finally: 
      if len(chunk)!=0: 
       yield tuple(chunk) 
+2

Tôi nghĩ rằng bạn có nghĩa là phạm vi (0, len (seq), n), thay vì phạm vi (0, len (seq)) – Noah

+0

-1: không hoạt động. – nosklo

+0

Noah: ta, thật vậy. – bobince

7

Hoặc, chúng tôi ing itertools (xem recipe cho grouper):

from itertools import izip 
def group2(iterable): 
    args = [iter(iterable)] * 2 
    return izip(*args) 

tuples = [ab for ab in group2(tuple)] 
+0

+1: để đề cập đến tài liệu (bạn đến trước :) – tzot

0

tôi trình bày mã này dựa trên Peter Hoffmann's answer như một phản ứng để dfa's comment.

Nó được đảm bảo để làm việc có hay không tuple của bạn có một số nguyên tố.

[(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)] 

Tham số phạm vi (len(tup)/2)*2 tính toán số chẵn cao nhất ít hơn hoặc bằng chiều dài của tuple vì vậy nó được đảm bảo để làm việc hay không tuple có một số chẵn các yếu tố này.

Kết quả của phương pháp sẽ là danh sách. Điều này có thể được chuyển đổi thành bộ dữ liệu sử dụng hàm tuple().

mẫu:

def inPairs(tup): 
    return [(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)] 

# odd number of elements 
print("Odd Set") 
odd = range(5) 
print(odd) 
po = inPairs(odd) 
print(po) 

# even number of elements 
print("Even Set") 
even = range(4) 
print(even) 
pe = inPairs(even) 
print(pe) 

Output

 
Odd Set 
[0, 1, 2, 3, 4] 
[(0, 1), (2, 3)] 
Even Set 
[0, 1, 2, 3] 
[(0, 1), (2, 3)]