2013-09-05 3 views
1

Я очень новичок в Python, и сюда пришло последнее средство. Я потратил несколько часов на замешивание своих заметок и Интернета, чтобы попытаться понять, как это сделать, но безрезультатно.Нужна помощь в распечатке списка по вертикали

У меня есть список, который организовывается похож на этот:

classes = ['''Thermodynamics, MSE345, Smith, Quantum Mechanics, MSE350, Johnson, Electrical Engineering, ECE322, Roberts, etc. etc.'''] 

мне нужно распечатать список вертикально с классом, кода курса, и профессор на одной линии, например, так:

термодинамика, MSE345, Смит

Квантовая механика, MSE350, Джонсон

Поскольку в списке есть запятые, разделяющие класс, код и профессор, я не могу понять, как распечатать список со всеми этими вещами на одной линии вместе.

Когда я ввел код ->classes.split(','), он напечатал каждую запятую, выделенную фразой на своей собственной строке, и они содержатся в ''. Мне нужно избавиться от цитат и скобок. Если бы вы могли мне помочь, я был бы очень благодарен. Не желая, чтобы кто-то выполнял мою домашнюю работу для меня, если бы вы могли объяснить, какие команды мне нужно использовать, я могу (надеюсь) выяснить остальное самостоятельно. Это моя первая неделя программирования, я чувствую, что это немного над моей головой!

+6

Почему ваш список имеет одну большую строку в нем вместо одной строки для каждого логического элемента? – user2357112

+0

msw, пожалуйста, не вставляйте пробелы в многострочный строковый литерал. – user2357112

+0

Точка взята, я понял, что был doubleplusungood перед тем, как вы вернули его; извините – msw

ответ

2

Прежде всего, вы должны сделать split вашу длинную строку классов в список, вы можете сделать это, используя str.split(','). Затем вы можете перебирать этот список в кусках из трех, чтобы сформировать пары данных класса. Для этого вы можете использовать itertools (в частности, groupby) documentation here.

from itertools import izip_longest 

def grouper(iterable, n, fillvalue=None): 
    args = [iter(iterable)] * n 
    return izip_longest(*args, fillvalue=fillvalue) 

classes = "Thermodynamics, MSE345, Smith, 
    Quantum Mechanics, MSE350, Johnson, 
    Electrical Engineering, ECE322, Roberts, 
    etc. etc." 

classes_list = classes.split(",") 

for i in grouper(classes_list,3): # or even grouper(classes.split(",")...) 
    print str("".join(i)) # formatting fix 

Выход:

Thermodynamics MSE345 Smith 
Quantum Mechanics MSE350 Johnson 
Electrical Engineering ECE322 Roberts 
... 
1

Мой лучший совет будет для вас, чтобы использовать словарь вместо списка или, по крайней мере, список внутри словаря, содержащего все остальные значения для данного ключа

4

Я бы не сказал, что это лучший способ сделать это, но если это ваша первая неделя программирования может быть проще понять

classes = "Thermodynamics, MSE345, Smith, Quantum Mechanics, MSE350, Johnson, Electrical Engineering, ECE322, Roberts" 
classes = classes.split(',') #turn it into a list 
for i in range(0, len(classes), 3): #every third index 
    print classes[i] + ',' + classes[i+1] + ',' + classes[i+2] #print 3 elements with commas 

Выход

Thermodynamics, MSE345, Smith 
Quantum Mechanics, MSE350, Johnson 
Electrical Engineering, ECE322, Roberts 
+0

+1 за показ того, что 'range' позволяет определить размер шага. – icedwater

+1

+1 за то, что вы делаете это с помощью инструментов, вероятно, находящихся в распоряжении ФП. CS101, вероятно, будет препятствовать использованию 'itertools' для чего-то подобного. – Brian

1

Хм, если я просто думаю о простом решении возможных ...

for i in range(len(classes))//3: 
    j = i * 3 
    print(', '.join(classes[j:j+3])) 

Нечто подобное должно работать. Это предполагает, что каждый элемент в вашем списке является некоторой строкой ... и что список имеет длину, кратную 3, и вы хотите печатать группами по три строки, разделенные запятыми.

+0

Но это не даст правильного выхода. – smac89

2

вместо использования списка с помощью только одного элемента делает его в строку, которая выглядит следующим образом:

classes = 'Thermodynamics, MSE345, Smith, Quantum Mechanics, MSE350, Johnson, Electrical Engineering, ECE322, Roberts, etc. etc.' 

затем использовать split(','), чтобы сделать список каждого элемента, разделенных запятыми затем разделить этот список в список списки, которые являются 3 пунктов тоскую, как так

class_list = classes.split(",") 

sorted_list = [class_list[i:i+3] for i in range(0, len(class_list), 3)] 

print sorted_list 

отпечатывается

[['Thermodynamics', ' MSE345', ' Smith'], [' Quantum Mechanics', ' MSE350', ' Johnson'], [' Electrical Engineering', ' ECE322', ' Roberts']] 
0
def group(classlist, n): 
    l = len(classlist) 
    for inc in xrange(0, l, n): 
     if (inc + n) < l: 
      yield tuple(classlist[P] for P in xrange(inc, inc+n)) 

classes = ['''Thermodynamics, MSE345, Smith, Quantum Mechanics, MSE350, Johnson, Electrical Engineering, ECE322, Roberts, etc. etc.'''][0].split(',') 

newlist = [ person for person in group(classes, 3) ] 

print newlist 

Выход:

[('Thermodynamics', ' MSE345', ' Smith'), 
(' Quantum Mechanics', ' MSE350', ' Johnson'), 
(' Electrical Engineering', ' ECE322', ' Roberts')] 
1
  1. LEN (классы) равно 1. "классы" представляет собой одну строку.
  2. В результате, вы можете также рассмотреть решения, где классы = «» «....„“» (или Foo = классы [0], и решения, которые работают на Foo.
  3. Когда вы делаете что вам нужно беспокоиться о том, что строка, охватывающая , несколько строк. Конструкция '' 'позволяет концы' '' встречаться со многими строками позже. Но если в начале и в конце есть скобки, у вас есть одна строка. имеют одну длинную строку из нескольких строк.
  4. Gotcha - Название класса или инструктора может иметь запятую '' 'C, C#, C++ и аналогичные языки CS203, Kernighan, Richie и др. al, редакторы, ..... '' '
  5. Даже если в корпусе Gotcha вы можете использовать идентификаторы курса как «разделители», вам нужно беспокоиться о том, что инструкторы отделены от названия курса. Тьфу
0

Еще один способ:

In [28]: s = "Thermodynamics, MSE345, Smith, Quantum Mechanics, MSE350, Johnson, Electrical Engineering, ECE322, Roberts" 

In [29]: splits = s.split(', ') 

In [30]: n = len(splits) 

In [31]: zip(*[splits[i::3] for i in range(n/3)]) 
Out[31]: 
[('Thermodynamics', 'MSE345', 'Smith'), 
('Quantum Mechanics', 'MSE350', 'Johnson'), 
('Electrical Engineering', 'ECE322', 'Roberts')]