2015-03-19 2 views
0

Я представлю это, заявив, что я новичок, и это касается домашнего задания в классе Intro to Programming ...Python- Как распечатать параллельные списки/массивы, аккуратно, в двух столбцах ...?

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

В настоящее время я использую следующий код в модуле для печати моих списков (представленных параметры «S» и «E» для зарплаты и работника):

def printArrays(S, E): 

    for i in S: 
     idx = (S.index(i)) 
     print ("name: " + E[idx] + "  salary: $ %0.3f" % i) 

выход из выше код выглядит следующим образом:

name: Joe Smith  salary: $ 25.500 
name: Samantha Johnson  salary: $ 45.750 
name: Dan Pak  salary: $ 75.000 

То, что я хотел бы аккуратные столбцы, которые не расположены в шахматном порядке. Еще лучше, я хотел бы, чтобы результат выглядел следующим образом:

Employee name:  Salary: 

Joe Smith   $ 25.500 
Samantha Johnson $ 45.750 
Dan Pak   $ 75.000 

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

+0

посмотреть на '.format 'метод в python. Вы можете указать ширину столбца. – letsc

ответ

2
def printArrays(S, E): 
    for i in S: 
     idx = (S.index(i)) 
     print ("name: {0:>10} salary: ${1:>10}".format (E[idx], i) 
0

Существует модуль питона называется prettytable, которые могут пригодиться в вашем случае, see here. Вы могли бы сделать так:

from prettytable import PrettyTable 

def printArrays(S, E): 

    tbl = PrettyTable(["Employee name", "Salary"]) 

    for i in S: 
     idx = (S.index(i)) 
     tbl.add_row([E[idx], i]) 

    print tbl 
0
for i in S: 
    idx = (S.index(i)) 
    print('%-20s $ %0.3f' % (E[idx], i)) 

'%20s' вместо '%-20s' будет выравнивать вправо.

Если вы хотите, чтобы заполнить динамическую ширину, string.ljust и string.rjust Ваши друзья:

max_width = max([len(x) for x in E]) 
for i in S: 
    idx = (S.index(i)) 
    print('%s $ %0.3f' % (E[idx].ljust(max_width), i)) 

Конечно, это может быть сделано с str.format, тоже. Это еще более мощно.

0

Не по теме, но так как вы учитесь, это может помочь вам:

for i in S: 
    idx = (S.index(i)) 

страшно.

Используйте один из следующих действий:

for e, s in zip(E,S): 

for idx, i in enumerate(S): 

for idx in range(len(S)): 

(первый лучше, потому что больше не в состоянии доказательства, он будет перебирать только на самом маленьком массиве, если они не имеют одинаковый размер).

Кроме того, переменные имен E и S не очень хорошие. salaries и employees было бы лучше.

Двигаясь дальше, вы можете определить простую структуру, например, так:

employees = [{'name': name, 'salary': salary} for name, salary in zip(E,S)] 

Затем вы можете перебирать прямо в этом списке и получить значения вам нужно:

for employee in employees: 
    print("name: {name:>10} salary: ${salary:>10}".format(**employee)) 
Смежные вопросы