2013-04-16 40 views
9

nói rằng tôi có một danh sáchPython: chuyển đổi danh sách để phát

data = [] 
    data.append("A") 
    data.append("B") 
    data.append("C") 
    data.append("D") 

Làm thế nào để chuyển đổi này vào một loại máy phát điện? Bất kỳ sự giúp đỡ với một mã mẫu được đánh giá cao ...

Tìm thấy một URL http://eli.thegreenplace.net/2012/04/05/implementing-a-generatoryield-in-a-python-c-extension/

Có những gì tôi muốn làm gì?

+0

từ khóa google 'yield' – yedpodtrzitko

Trả lời

2
import itertools 
iter_data = itertools.chain(data) 

như vậy:

In [10]: data 
Out[10]: [1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [11]: iter_data=itertools.chain(data) 

In [12]: iter_data 
Out[12]: <itertools.chain at 0x1ce8950> 

In [13]: iter_data.next() 
Out[13]: 1 
+5

FWIW, điều này không khác biệt gì so với 'iter_data = iter (dữ liệu)' ... Bạn không thực sự chuỗi bất kỳ thứ gì ở đây. – mgilson

+1

không chaining gì? người ta không thể có một chuỗi liên kết đơn lẻ? ;-) –

1
>>> d = ['A', 'B', 'C', 'D'] 
>>> 
>>> def gen(d): 
...  for i in d: 
...    yield i 
... 
>>> for i in gen(d): 
...  print i 
... 
A 
B 
C 
D 
>>> 
6

Tương đương theo nghĩa đen sẽ là:

def data_generator(): 
    yield 'A' 
    yield 'B' 
    yield 'C' 
    yield 'D' 

Gọi chức năng máy phát điện trả về một máy phát điện-iterator. Đi qua các máy phát điện-iterator để các nhà xây dựng danh sách cung cấp cho:

>>> list(data_generator()) 
['A', 'B', 'C', 'D'] 

máy phát điện-iterator này cũng có thể được tạo ra bằng cách sử dụng biểu phát:

data_iter = (c for c in 'ABCD') 

Lưu ý: Bạn điền danh sách của bạn với bốn báo cáo thêm . Đó thường không phải là cách bạn sẽ viết nó.

Thay làm:

data = ['A', 'B', 'C', 'D'] 
1

Bạn có nghĩa là một cái gì đó như thế này?

def gen(): 
    for x in "ABCD": 
     yield x 

In [9]: it=gen() 

In [10]: next(it) 
Out[10]: 'A' 

In [11]: next(it) 
Out[11]: 'B' 

In [12]: next(it) 
Out[12]: 'C' 

In [13]: next(it) 
Out[13]: 'D' 
13
>>> (n for n in [1,2,3,5]) 
<generator object <genexpr> at 0x02A52940> 

công trình bằng Python 2.7.4+

>>> a2g = lambda x : (n for n in x) 
>>> a2g([1,2,3,4,5]) 
<generator object <genexpr> at 0x02A57CD8> 

Edit:

hơn Một biến thể nhẹ của một nhà máy phát điện lambda mẫu

>>> a2g = lambda *args: (n for n in args) 
>>> for i in a2g(1,2,3,4, 5): print i 

1 
2 
3 
4 
5 
0
(item for item in listNameHere).next() 

Đây là cách chung để làm điều đó, nếu tôi nhớ chính xác.

>>> a = [0,1,2,3,4] 
>>> x = (item for item in a) 
>>> x 
<generator object <genexpr> at 0x028B8440> 
>>> x.next() 
0 
>>> x.next() 
1 
>>> x.next() 
2 

vv vv

9

Bạn có chắc chắn, bạn muốn tạo một máy phát điện ? Máy phát điện là hàm trả về một loại trình lặp, được xây dựng, ví dụ: bằng cách sử dụng từ khóa yield (xem term-generator). Nếu bạn thực sự muốn điều này, câu trả lời steven-rumbalski 's là chính xác những gì bạn đang tìm kiếm:

data_gen = (y for y in data) 

Hầu hết thời gian, bạn sẽ muốn trực tiếp tạo ra một đối tượng iterator, ví dụ để sử dụng phương thức next().Trong trường hợp này, câu trả lời là tiềm ẩn trong các bình luận của mgilson trên:

data_iter = iter(data) 

tương đương với data_iter = data.__iter__(), xem functions#iter.

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