2016-11-25 2 views
2
def main(): 
    salesData= readData('icecream.txt') 
    print(salesData) 
    #printReport(salesData) 


# Reads the tabular data 
# @param filename name of the input file 
# @return a dictionary whose keys are ice cream flavors and whose values are sales data. 

def readData(filename): 
    # Create an empty dictionary. 
    salesData={} 

    infile=open(filename, "r") 

    # Read each record from the file. 
    for line in infile: 
     fields=line.split(":") # what is field datatype 
     flavor=fields[0] 
     salesData[flavor]=buildList(fields) 
     #print("SalesData", salesData) 
     #print() 
     #print() 
    infile.close() 
    return salesData 

# Builds a list of store sales contained in the fields split from a string. 
# @param fields a list of strings comprising the record fields 
# @return a list of floating-point values 

def buildList(fields): 
    storeSales= [] 
    for i in range (1, len(fields)): 
     sales=float(fields[i]) 
     storeSales.append(sales) 
     #print('StoreSales', storeSales) 
     #print() 
    return storeSales 

# Prints a sales report. 
def printReport(salesData): 
    numStores=0 

#print the dictionary first without the totals? 
#call print report 


main() 

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

{'chocolate': [10225.25, 9025.0, 9505.0], 'strawberry': [9285.15, 8276.1, 8705.0], 'cookie dough': [7901.25, 4267.0, 7056.5], 'rocky road': [6700.1, 5012.45, 6011.0], 'vanilla': [8580.0, 7201.25, 8900.0]} 

Однако, мне нужно, чтобы выглядеть это:

chocolate 10225.25 9025.0  9505.0  Total: 28755.25 
vanilla  8580.0  7201.25  8900.0  Total: 24681.25 
rocky road 6700.1  5012.45  6011.0  Total: 17723.55 
strawberry 9285.15 8276.1  8705.0  Total: 26266.25 
cookie dough 7901.25 4267.0  7056.5  Total: 19224.75 
      **42691.75 33781.8  40177.5** 

Чистый, организованный, с вкладками, идеальное выравнивание. Я не знаю, как извлечь данные из словаря в чистом виде. Кроме того, я должен добавить итоги для шоколада и т. Д., А также 1, 2 и 3 столбцы. Презентация важна. Это не просто «как мне выводить данные», но «как я могу выводить данные с чистой презентацией». Я думал об использовании вложенных циклов или, возможно, что-то с циклом for. Но где это для цикла, или как я использую его для распечатки данных словаря, как я хочу, чтобы это выглядело, вне меня. Я просмотрел другие вопросы, но ничто не приближается к этому уровню табулирования, организации и печати для данных, поступающих из словаря. Я также попытался часто цитировать «для ключа, val в X.items():« но это не сработало для меня. Я даже не знаю, с чего начать с этой функции, и ее запутывание вне веры. Где бы я это сказал? Как бы это назвать? Куда я пойду оттуда? Не говоря уже о том, что у меня есть столбцы для добавления, а также строки для добавления. Это очень конкретный вопрос. Спасибо.

+0

Я понятия не имею, что там происходит ... –

+0

Ответ peter не касается добавления столбца ... также, ваш код был отличным и отлично работал, он просто не добавлял столбцы. Я думал (может быть, вы могли бы помочь мне здесь), инициализировав три столбца (col1, col2 и col3) в 0, а затем + = их для значений [0] [1] и [2], а затем напечатав 'print (" \ t \ t ", col1," \ t ", col2," \ t ", col3)' однако он не работает: он не печатает сумму столбцов. Только один из вкусов. –

+0

Да. Я получал результаты, которые я хотел от вашего предложения, и я успешно провел его без сучка и задоринки; однако в нем отсутствовали только три номера: '42691,75 33781,8 40177,5'. То есть я до сих пор не знаю, как суммировать значения [0] от каждого ключа до одного числа, которое выводится ниже соответствующего столбца (повторить для значений [1] и [2]). –

ответ

1

Python имеет отличный мини-язык специально для форматирования строк. Это то, что нужно использовать.

Вы знаете, что вы хотите, чтобы ваш формат будет

flavor sell1 sell2 sell3 Total: total sells

Что бы приравнять к следующему формату строки:

"{} \t {} \t {} \t {} \t Total: {}"

Так что теперь вы знаете свой формат, следующий шаг должен применить этот формат для каждой пары key, value в вашем словаре. Используйте цикл for для перебора каждой пары key, value.

for key, value in dictionary.items(): 
    print("{} \t {} \t {} \t {} \t Total: {}".format(...)) 

Последнее, что осталось сделать, это заполнить пробелы.Вы знаете, что key s в вашем dict() являются ароматами, поэтому первый параметр format() бы быть key переменными:

.format(key, ...)

Далее вам нужны три значения из ваших key-х значения. Мы могли бы индексировать каждое значение из из value:

.format(key, value[0], value[1], value[2], ...)

Bu это немного многословный, и Python был лучший метод. Мы можем просто «распаковать» список значений в соответствующие точки, используя синтаксис *iterable.

.format(key, *value, ...)

И последнее значение осталось заполнить будет ваш общий. Вы можете сделать использование встроенной функции sum() добавить все значения в values вместе:

.format(key, *value, sum(value))

Теперь напечатать сумму каждого столбца, сначала нужно значение каждого ключа в вашем dict(). Это можно сделать с помощью простого списка понимание:

sales = [value for value in d.values()] 

Далее, мы должны получить первое значение из каждого списка в sales и добавить значение. Это может быть сделано с помощью списка понимания и zip() встроенной функции:

totals = [round(sum(l), 1) for l in zip(*sales)] 

Круглой функции используются с поплавками округлить их до определенного знака после запятой. Вы можете изменить этот номер по своему вкусу, но я выбрал его. Последнее, что осталось сделать, это распечатать итоги каждого столбца. После небольшого количества экспериментов, это должно работать нормально:

`print("\t\t {}\t {}\t {}".format(*totals)) 

Таким образом, окончательный, законченное решение будет:

sales = [value for value in d.values()] 
    totals = [round(sum(l), 1) for l in zip(*sales)] 
    for key, value in salesData.items(): 
     print("{} \t {} \t {} \t {} \t Total: {}".format(key, *value, sum(value))) 
    print("\t\t {}\t {}\t {}".format(*totals)) 
+0

Спасибо! Это сработало для меня. Однако мне не хватает одной вещи: ** как вывести сумму столбца под каждым соответствующим столбцом. ** Любая помощь будет оценена. –

+0

Я получаю сообщение об ошибке «d» в «d.values ​​()» не определено ... почему? благодаря! –

+0

Nevermind! Спасибо! –

3

Вы можете использовать python's string formatting, чтобы создать обычный внешний вид.

Там хороший сайт просто сделать с питона форматированием: https://pyformat.info

Формат строки таблицы будет выглядеть примерно так:

>>> row = '{flavour}\t{sales[0]}\t{sales[1]}\t{sales[2]}\tTotal: {total}' 

Тогда вы можете заполнить поля:

>>> row.format(flavour='chocolate', 
...   sales=[10225.25, 9025.0, 9505.0], 
...   total=sum([10225.25, 9025.0, 9505.0])) 
'chocolate 10225.25 9025.0  9505.0  Total: 28755.25' 

Чтобы вывести эти поля из словаря:

>>> for flavour, sales in salesData.items(): 
...  print(row.format(flavour=flavour, 
...      sales=sales, 
...      total=sum(sales))) 
chocolate 10225.25 9025.0  9505.0  Total: 28755.25 
vanilla  8580.0  7201.25  8900.0  Total: 24681.25 
rocky road 6700.1  5012.45  6011.0  Total: 17723.55 
strawberry 9285.15 8276.1  8705.0  Total: 26266.25 
cookie dough 7901.25 4267.0  7056.5  Total: 19224.75 
+0

Эй, спасибо, Питер. Ценить это. Пара вопросов, хотя: Где идет цикл for? Является ли он внутри функции 'def main():' после 'salesData = readData ('icecream.txt')'? Кроме того, я хочу избежать, если это вообще возможно, вручную переносить данные в программу. Видите ли, цель состояла в том, чтобы получить информацию из файла, называемого 'icecream.txt' (который имеет информацию о словарях), выведенный непосредственно в формате excel. Я должен был бы заменить 'icecream.txt' с помощью, скажем,' candy.txt', и вывести его в том же формате, не переносив все данные вручную в основную порграмму. –

+0

'printReport' выглядит как хорошее место, чтобы положить цикл. Кроме того, чтобы передать имя файла для данных в ваш скрипт, см. [Как передать имя файла в качестве параметра в мой модуль?] (Https://stackoverflow.com/questions/491085/how-can-i-pass- a-filename-as-a-parameter-in-my-module.) или лучше [sys.argv \ [1 \], что означает скрипт] (https://stackoverflow.com/questions/4117530/sys-argv1- смысл в скрипте) –

1

Попробуйте следующее:

def format_data(data): 
    for item in data: 
     print('{:15} {:15} {:15} {:15} {:10} Total:{:5}'.format(
      item, data[item][0], data[item][1], data[item][2], '', 
      sum(data[item]))) 
    print('{:15} {:15} {:15} {:15}'.format('', 
     sum(data[item][0] for item in data), 
     sum(data[item][1] for item in data), 
     sum(data[item][2] for item in data))) 

Выход:

>>> data = {'chocolate': [10225.25, 9025.0, 9505.0], 'strawberry': [9285.15, 8276.1, 8705.0], 'cookie dough': [7901.25, 4267.0, 7056.5], 'rocky road': [6700.1, 5012.45, 6011.0], 'vanilla': [8580.0, 7201.25, 8900.0]} 

>>> format_data(data) 
rocky road    6700.1   5012.45   6011.0   Total:17723.55 
strawberry    9285.15   8276.1   8705.0   Total:26266.25 
vanilla     8580.0   7201.25   8900.0   Total:24681.25 
cookie dough   7901.25   4267.0   7056.5   Total:19224.75 
chocolate    10225.25   9025.0   9505.0   Total:28755.25 
         42691.75   33781.8   40177.5 
+0

Я не совсем думаю, что это то, чего хотел OP. Все его ряды выровнены спереди. –

+0

@leaf Вам может понравиться отредактированный ответ – ettanany

+0

Результат правильный, так что это здорово! Но моя самая большая жалоба - ваши огромные однострочники. Может быть, они могут быть разбиты на более мелкие куски кода? :) –

0
for key, value in salesData.items(): 
    print("{} \t {} \t {} \t {} \t Total: {}".format(key, *value, sum(value))) 
print("\t", "{} \t {} \t {} \t {} \t".format('', 
sum(salesData[value][0] for value in salesData), 
sum(salesData[value][1] for value in salesData), 
sum(salesData[value][2] for value in salesData))) 

Войдите в раздел def main(): и вы получите желаемый результат.

Смежные вопросы