2016-07-08 29 views
19

Có cách nào đơn giản/sạch sẽ để giải nén một tuple Python ở phía bên tay phải từ trái sang phải không?Mở gói một tuple Python từ trái sang phải?

Ví dụ cho

j = 1,2,3,4,5,6,7 

(1,2,3,4,5,6,7) 

v,b,n = j[4:7] 

Tôi có thể sửa đổi các ký hiệu lát để v = j[6], b=j[5], n=j[4]?

Tôi nhận ra mình chỉ có thể đặt bên trái để lấy phần tử mong muốn nhưng có thể có những trường hợp mà tôi chỉ muốn giải nén tuple từ trái sang phải.

+4

Tại sao bạn không chỉ sắp xếp lại phía bên trái? – user2357112

+2

Nếu bạn muốn đảo ngược các chuỗi tùy ý để gán, 'v, b, n = đảo ngược (my_values)' sẽ làm. Ví dụ: không thể đảo ngược 'collection.deque' bằng ký hiệu slice. – MisterMiyagi

+0

Bạn có thể đơn giản đảo ngược danh sách và cắt nó cho phù hợp –

Trả lời

14

Trong trường hợp bạn muốn giữ lại các chỉ số ban đầu (tức là không muốn bận tâm với việc thay đổi 4 và 7-6 và 3), bạn cũng có thể sử dụng:

v, b, n = (j[4:7][::-1]) 
+0

Tác phẩm này cũng cảm ơn sự giúp đỡ của bạn. Chỉ mục của phần tử cuối cùng có giá trị 7 là [6] và trong phần tử của chúng ta, từ [4] đến [7] không được bao gồm.Trong câu trả lời của Moses, tôi nghĩ rằng nó tương tự nhưng nằm trong khoảng từ [6] đến hết [3] không bao gồm. Vì vậy, có vẻ như cả hai đều truy cập vào các chỉ số tương tự và giải pháp được cung cấp bởi Mosses một chút sạch hơn tôi nghĩ. Cảm ơn –

50

này nên làm:

v,b,n = j[6:3:-1] 

Một giá trị bước -1 bắt đầu từ 6

+0

Cảm ơn rất nhiều đã làm điều đó. Tôi đã thử tương tự nhưng như một người mới bắt đầu tuyệt đối đã cố gắng [3: 6: -1] không hiểu chỉ số dừng bắt đầu cần được đảo ngược cũng như –

+0

@AnthonyLeeMeier Bạn cũng có thể xem chủ đề này trên [SO] (http: //stackoverflow.com/questions/509211/explain-pythons-slice-notation) –

+1

Tôi nghĩ có lẽ 'v, b, n = j [: - 4: -1]' là tốt hơn, vì nó bất khả tri về chiều dài của ' j'. – Paul

10
n,b,v=j[4:7] 

cũng sẽ làm việc. Bạn chỉ có thể thay đổi thứ tự hoặc các giá trị giải nén trở

+7

* Tôi nhận ra rằng tôi chỉ có thể đặt bên trái để lấy phần tử mong muốn * –

8

Bạn có thể bỏ qua các đầu tiên sau khi đảo ngược và sử dụng extended iterable unpacking:

j = 1, 2, 3, 4, 5, 6, 7 


_, v, b, n, *_ = reversed(j) 

print(v, b, n) 

Trong đó sẽ cung cấp cho bạn:

6 5 4 

Hoặc nếu bạn muốn có được các yếu tố tùy ý bạn có thể sử dụng operator.itemgetter:

j = 1, 2, 3, 4, 5, 6, 7 

from operator import itemgetter 


def unpack(it, *args): 
    return itemgetter(*args)(it) 

v,b,n = unpack(j, -2,-3,-4) 

print(v, b, n) 

Lợi thế của itemgetter là nó sẽ hoạt động trên bất kỳ lặp lại nào và các phần tử không cần phải liên tiếp.

+3

Vâng, bạn cũng có thể làm 'v, b, n = đảo ngược (j [4: 7])' mà không sử dụng mở rộng mở rộng. điều này có lợi ích là nếu 'j' dài 10 triệu mục thì trình thông dịch không phải tạo danh sách mới chứa tất cả các phần tử khác. – Bakuriu

0

bạn có thể thử này,

-1 có nghĩa là tìm kiếm từ đảo ngược, với phần tử thứ 3 cuối cùng cho phần tử cuối cùng

>>> v,b,n=j[-1:-4:-1] 
>>> print 'v=',v,'b=',b,'n=',n 
v= 7 b= 6 n= 5 
>>> 
Các vấn đề liên quan