2013-07-23 28 views
6

Tôi muốn lấy một yếu tố từ một frozenset (không sửa đổi nó, tất nhiên, như frozensets là bất biến). Giải pháp tốt nhất mà tôi đã tìm thấy cho đến nay là:Làm thế nào để có được một yếu tố tùy ý từ một frozenset?

s = frozenset(['a']) 
iter(s).next() 

trả về, như mong đợi:

'a' 

Nói cách khác, là có cách nào để 'popping' một phần tử từ một frozenset mà không thực sự popping nó?

+4

Tôi nghĩ rằng phương pháp của bạn là như Nếu bạn muốn có một phần tử ngẫu nhiên, bạn có thể kiểm tra 'random.sample (fset, 1)'. – bbayles

+0

Tại sao bạn muốn bật phần tử, bởi vì nó tùy ý? – martineau

+1

Tôi chỉ muốn lấy một số phần tử tùy ý từ Tôi không nên sử dụng từ pop kể từ khi thiết lập vẫn không thay đổi. Nó tương tự như nhìn trộm fi yếu tố đầu tiên của một ngăn xếp mà không popping nó. – ablondin

Trả lời

5

(Tóm tắt các câu trả lời được đưa ra trong các ý kiến)

phương pháp của bạn là tốt như bất kỳ, với sự báo trước đó, từ Python 2.6, bạn nên sử dụng next(iter(s)) hơn iter(s).next().

Nếu bạn muốn có một ngẫu nhiên yếu tố chứ không phải là một tùy ý một, sử dụng như sau:

import random 
random.sample(s, 1)[0] 

Dưới đây là một vài ví dụ chứng minh sự khác biệt giữa hai:

>>> s = frozenset("kapow") 
>>> [next(iter(s)) for _ in range(10)] 
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] 
>>> import random 
>>> [random.sample(s, 1)[0] for _ in range(10)] 
['w', 'a', 'o', 'o', 'w', 'o', 'k', 'k', 'p', 'k'] 
+0

Tại sao bạn nên gọi 'next (iter (s))' thay vì 'iter (s) .next()'? – rynemccall

+2

@rynemccall Vì trong Python 3, ['iter.next()' không tồn tại] (https://www.python.org/dev/peps/pep-3114/). –

7

Nếu bạn biết điều đó nhưng là một phần tử trong frozenset, bạn có thể sử dụng tính năng giải nén có thể lặp lại:

s = frozenset(['a']) 
x, = s 

Đây là một trường hợp đặc biệt của câu hỏi ban đầu, nhưng có ích một số lần.

Nếu bạn có rất nhiều trong số này để làm điều đó có thể là nhanh hơn tới (ITER ..:

>>> timeit.timeit('a,b = foo', setup='foo = frozenset(range(2))', number=100000000) 
5.054765939712524 
>>> timeit.timeit('a = next(iter(foo))', setup='foo = frozenset(range(2))', number=100000000) 
11.258678197860718 
+0

'ValueError: quá nhiều giá trị để giải nén' khi được đặt với nhiều phần tử. –

+0

như đã nói, điều này chỉ hoạt động với * chính xác * một phần tử trong frozenset. –

2

Bạn có thể sử dụng với python 3:

>>> s = frozenset(['a', 'b', 'c', 'd']) 
>>> x, *_ = s 
>>> x 
'a' 
>>> _, x, *_ = s 
>>> x 
'b' 
>>> *_, x, _ = s 
>>> x 
'c' 
>>> *_, x = s 
>>> x 
'd' 
+0

Điều này hoạt động ngay cả đối với từ điển. – tammoj

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