2013-02-22 16 views
6

Giả sử tôi có bất kỳ iterableCó bất kỳ chức năng duy nhất để in iterables giá trị

var = "ABCDEF"

tôi nhận được iterable như thế này

it = itertools.combinations(var,2)

là có bất kỳ chức năng duy nhất để in tất cả các giá trị của các lần lặp có thể là

printall(it)

thay vì sử dụng vòng lặp

+3

Tại sao vòng lặp 'for' lại là vấn đề? –

+0

Tôi không tin như vậy, nhưng tôi có thể sai ... – xxmbabanexx

+1

Chờ ... bạn có thể tạo mô-đun của riêng bạn bằng chức năng tùy chỉnh và cài đặt nó bằng cách sử dụng distilus. – xxmbabanexx

Trả lời

14

Điều này phụ thuộc vào những gì bạn muốn, nếu bạn muốn in ra tất cả các giá trị, bạn cần tính toán chúng - không thể đảm bảo các giá trị được tính toán cho đến sau tất cả các yêu cầu, vì vậy cách đơn giản nhất để đạt được điều này là để make a list:

print(list(iterable)) 

này sẽ in ra các mục trong danh sách định dạng bình thường, mà có thể phù hợp. Nếu bạn muốn mỗi mục trên một dòng mới, lựa chọn tốt nhất là, như bạn đã đề cập, một đơn giản cho vòng lặp:

for item in iterable: 
    print(item) 

Nếu bạn không cần dữ liệu trong một định dạng cụ thể, nhưng chỉ cần nó để được có thể đọc được (không phải tất cả trên một dòng), bạn có thể muốn xem the pprint module.

Một lựa chọn cuối cùng, mà tôi không thực sự cảm thấy là tối ưu, nhưng đề cập đến cho đầy đủ, có thể trong 3.x, nơi the print() function là rất linh hoạt:

print(*iterable, sep="\n") 

Ở đây chúng ta unpack the iterable như các đối số print() và sau đó làm cho dấu phân cách một dòng mới (trái ngược với không gian thông thường).

+1

Ngoài ra, nó có thể đáng để chỉ ra rằng khi một trình lặp đã được lặp lại, nó được tiêu thụ. –

+1

@JoelCornett Thật vậy. Mặc dù nếu bạn đã tạo ra một danh sách, bạn có thể lặp lại thay vào đó. –

+0

để in (* lặp lại) là người chiến thắng. –

4

Bạn có thể sử dụng phương thức str.join và tham gia từng phần tử của có thể lặp lại trên một dòng mới.

print('\n'.join(it)) 
+4

+1, nhưng nó đáng chú ý này giả định các yếu tố là chuỗi. Nếu không, [cần phải có biểu thức trình phát hoặc đọc danh sách] (http://www.youtube.com/watch?v=pShL9DCSIUw). –

1

Bạn có thể sử dụng định dạng mà sẽ cho phép mỗi phần tử được formated như bạn xin vui lòng:

>>> print '\n'.join('{:>10}'.format(e) for e in iter([1,2,'1','2',{1:'1'}])) 
     1 
     2 
     1 
     2 
    {1: '1'} 

Mỗi phần tử không cần phải là một chuỗi thiết, nhưng phải có một phương pháp __repr__ nếu nó là không phải là một chuỗi.

Sau đó, bạn có thể dễ dàng ghi các chức năng mà bạn mong muốn:

>>> def printall(it,w): print '\n'.join('{:>{w}}'.format(e,w=w) for e in it) 
>>> printall([1,2,'3','4',{5:'6'}],10) 
     1 
     2 
     3 
     4 
    {5: '6'} 

Tôi đang sử dụng một danh sách, nhưng bất kỳ iterable sẽ làm gì.

0

Bạn có thể sử dụng chain() chức năng từ itertools để tạo iterator cho var dữ liệu và sau đó chỉ cần giải nén sử dụng * nhà điều hành của iterator

>>> from itertools import chain 
>>> var = 'ABCDEF' 
>>> print(*chain(var)) 
A B C D E F 
>>> print(*chain(var), sep='\n') 
A 
B 
C 
D 
E 
F 

Nếu bạn chỉ cần lặp trên dữ liệu hiện có và in nó ra một lần nữa bạn có thể sử dụng nhà điều hành sao * cho số này

>>> print(*var) 
A B C D E F 
>>> print(*var, sep='\n') 
A 
B 
C 
D 
E 
F 
Các vấn đề liên quan