2013-02-28 39 views
8

Tôi có danh sách các bộ dữ liệu, được gọi là gradebook, trong đó mỗi phần tử danh sách là một bộ tương ứng với một lớp và một điểm mà học sinh có thể kiếm được. Ví dụ:Cách in danh sách các bộ phận

gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), 
      ('CS 130', 'Python', 'Spring 2013', 'A')] 

Và cứ tiếp tục như vậy. Tôi muốn nó in như thế này:

Class: Math 212.....Subject: Linear Algebra.....Term: Fall 2012.....Grade: B` 
Class: CS 130.......Subject: Computer Science...Term: Spring 2013...Grade: A` 

Tôi muốn có thể xem qua từng bộ trong danh sách, sau đó in ra từng phần tử của bộ dữ liệu. Làm thế nào tôi có thể đạt được điều này?

EDIT: Đây là những gì tôi có ngay bây giờ:

for aTuple in gradebook: 
    print(aTuple) 

Xin lỗi, tôi rất mới để Python, vì vậy tôi không thực sự hiểu cách làm việc này.

+0

nhờ @Hooked cho chỉnh sửa ... thậm chí hai năm sau đó haha: D – yiwei

Trả lời

7

định dạng chung, bạn có thể lặp thông qua một danh sách và truy cập vào các chỉ số của một tuple:

for x in gradebook: 
    print x[0], x[1] 

x [0] trong ví dụ này sẽ cung cấp cho bạn phần đầu tiên của tuple, và x [1] .... Sớm. Lộn xộn xung quanh và thử nghiệm với định dạng đó, và bạn có thể tự làm phần còn lại.

CHỈNH SỬA: Mặc dù một số câu trả lời khác đẹp hơn ở đây, theo nghĩa là chúng giải nén các bộ dữ liệu và theo dõi "cách thức Python" chặt chẽ hơn. Giống như ví dụ:

a, b, c = ('a','b','c') 
+0

cảm ơn! điều này đã hiệu quả và ngắn gọn. +1. câu hỏi phụ, bất kỳ ý tưởng làm thế nào để xóa một tuple từ danh sách cho một tên lớp nhất định? – yiwei

+1

@Yiwei Gao, Nếu bạn muốn xóa cụ thể một tuple khỏi danh sách, hãy làm: 'del x [0]', ví dụ 'x' là tên của danh sách của bạn và' 0' đại diện cho vị trí của bộ dữ liệu của bạn trong danh sách. – eazar001

+1

Ngoài ra, nếu bạn muốn xóa nó bằng cách sử dụng 'for loop' bạn sẽ chỉ nói:' del x' cho tuple hiện tại được truy cập trong vòng lặp, sử dụng câu lệnh 'if' thích hợp, trong vòng lặp của bạn. – eazar001

6

Hoặc bạn có thể làm điều này ...

for id, name, semester, grade in gradebook: 
    print id, name, semester, grade 
3
gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), ('CS 130', 'Python', 'Spring 2013', 'A')] 

fieldwidths = 13, 19, 14, 1 
for tup in gradebook: 
    tup = (s.ljust(w, '.') for s,w in zip(tup, fieldwidths)) 
    print 'Class: {}Subject: {}Term: {}Grade: {}'.format(*tup) 

Tôi đã tự đặt độ rộng lĩnh vực cho phù hợp ví dụ của bạn. Nhưng bạn có thể muốn tạo ra độ rộng trường một cách thông minh, tức là dựa trên các cột tối đa của độ dài phần tử trong sổ điểm.

Lần sau, cấu trúc dữ liệu tốt hơn cho các mục nhập sổ làm việc của bạn sẽ là dict thay vì tuple.

0

Bạn chỉ số bằng cách gán các yếu tố tên (đôi khi thuận tiện nếu bạn đang tính toán cái gì đó) có thể:

for (a, b, c, d) in gradebook: 
    print "Class: ", a, "...Subject: ", b, "...Term: ", c, "...Grade: ", d 

Lớp: Toán 212 ... Subject: Linear Algebra ... Hạn: Fall 2012 ... lớp: B

class: CS 130 ... Subject: Python ... hạn: Mùa xuân 2013 ... lớp: Một

Đối với thậm chí nhiều hơn khoảng cách:

for (a, b, c, d) in gradebook: 
    print "Class: ", a, "."*(20-len(a)), "Subject: ", b, "."*(20-len(b)), "Term: ", c, "."*(20-len(c)), "Grade: ", d 

Lớp: Toán 212 ............ Môn học: Đại số tuyến tính ...... Thời hạn: Mùa thu 2012 ........... Lớp: B

Lớp: CS 130 .............. Chủ đề: Python .............. Thời hạn: Mùa xuân 2013 .........Lớp: A

0

Tôi không quen thuộc với một số tùy chọn định dạng nâng cao hơn trong python. Điều đó đang được nói, điều này sẽ hiển thị kết quả theo yêu cầu. Bạn có thể truy cập các phần tử trong mỗi tuple theo chỉ mục của chúng. '.'*(#-len('column info'+g[i])) cung cấp số thời gian chính xác bằng cách trừ độ dài của chuỗi từ chiều rộng cột. Để in này mà không có khoảng trống giữa các yếu tố bạn sử dụng sep='' trong print()

gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), ('CS 130', 'Python', 'Spring 2013', 'A')] 
for g in gradebook: 
    print('Class: ', g[0], '.'*(20-len('Class: '+g[0])), 
    'Subject: ', g[1], '.'*(28-len('Subject: '+g[1])), 
    'Term: ', g[2], '.'*(20-len('Term: '+g[2])), 
    'Grade: ', g[3], sep = '') 
0

bạn có thể định nghĩa một hàm đặt tên __str__(self), mà trả về một chuỗi như hình thức "Class: Toán 212 ..... Tiêu đề: Linear Algebra. .... Thời hạn: Mùa thu 2012 ..... Lớp: B "trong lớp. thì bạn có thể sử dụng mã của mình:

for aTuple in gradebook: 
    print(aTuple) 

để nhận được kết quả mong đợi.

+0

Không nên thay đổi hành vi mặc định của các chức năng được tích hợp sẵn. –

0
gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), 
      ('CS 130', 'Python', 'Spring 2013', 'A'), 
      ('Economics History','1914','Fall 14','D')] 

fields = '...'.join('{:.<%ds}' % max(map(len,cat)) 
        for cat in zip(*gradebook)) 

print 'fields :\n%r\n\n' % fields 

def disp(x,fields=fields): 
    if all(isinstance(el,tuple) for el in x): 
     # x is a collections of tuples 
     print '\n'.join(fields.format(*el) for el in x) 
    elif all(isinstance(el,str) for el in x): 
     # x is a collection of strings 
     print fields.format(*x) 

print 'disp(gradebook) :\n\n', 
disp(gradebook) 
print '\n' 
print 'disp(gradebook[1]) :\n\n', 
disp(gradebook[1]) 

kết quả

fields : 
'{:.<17s}...{:.<14s}...{:.<11s}...{:.<1s}' 


disp(gradebook) : 

Math 212............Linear Algebra...Fall 2012.....B 
CS 130..............Python...........Spring 2013...A 
Economics History...1914.............Fall 14.......D 


disp(gradebook[1]) : 

CS 130..............Python...........Spring 2013...A 
Các vấn đề liên quan