2013-02-28 5 views
1

Я пытаюсь создать сценарий питона, который делает следующее:Как группировать, сортировать, подсчитать количество записей и вывода результатов

Table (DBF или CSV-я мог бы создать любой) всегда будет иметь только 4 записей. Столбец 2 (Let) всегда будет упорядочен a, b, c, d. Столбец 1 (Num) всегда будет иметь номера от 0 до 10, но частота и порядок будут различаться. Вывод должен быть отсортирован и сгруппирован по Num с наименьшим номером, выведенным первым. Если число в первом столбце появляется один раз, выводится только соответствующее письмо. Если число появляется дважды (т.е. две строки имеют одинаковое число), каждая соответствующая буква выводится с «и» между ними. Если число отображается более двух раз, каждая буква выводится с запятой между ними и «и» перед последней буквой. Каждая отображаемая группа букв получает свою собственную строку вывода.

основном ищет сортировать, группу и выход 1 из 4 вариантов:

«Нет данных»
1 письмо само по себе
2 буквы отделены друг от друга «и»
3 букв, разделенных запятыми и "и" перед последней буквой.

Ниже представлены различные версии таблицы soils_no.dbf и ее требуемые выходы в зависимости от ввода.

Num .......... Пусть
0 ............... а
0 ............ ... b
0 ............... c
0 ............... d
print "Нет данных"

Кол-во .......... Разрешить
8 ............... a
8 ............. ..b
2 ............... c
8 ............... d
печати с
печати а, б и д

Num .......... Пусть
4 ...............
1 ............... b
7 ............... c
3 ........... .... д
печати б
печать д
Отпечатайте
печати с

Num ....... ... Пусть
3 ............... a
3 ............... b
10 ..... ........ с
1 ............... д
печати д
печати а и б
печати с

Num ... ....... Пусть
10 ............... a
10 ............... b
10. ............ c
10 ...............d
print a, b, c и d

Я знаю, как прокручивать и вводить запятые и «и», но я не знаю, как группировать и сортировать. Выполнение этого с помощью python 2.7.

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

Cagillion благодарит заранее.

ответ

1

Обсуждение ниже.

from collections import defaultdict 

def pretty_print_lst(lst): 
    if not lst: 
     return "" 
    elif len(lst) == 1: 
     return lst[0] 
    elif len(lst) == 2: 
     # Join together two letters using " and " as the join. 
     return " and ".join(lst) 
    else: 
     # Use a "list slice" to join all in the list but the last item, 
     # using ", " as the join, then append " and " and append the 
     # last item. Last item is indexed with -1, which always works no 
     # matter how many or few items are in the list. 
     return ", ".join(lst[:-1]) + " and " + lst[-1] 

def print_rec(seq): 
    # group according to counts 
    d = defaultdict(list) 
    for row in seq: 
     n, letter = row # get count and letter from the row 
     d[n] += letter # append letter to that count list 

    # get a list of (key, value) pairs 
    # so the list entries are: (count, list_of_letters) 
    results = list(d.items()) 
    results.sort() 
    if len(results) == 1 and results[0][0] == 0: 
     # if all 4 letters have a count of 0, 
     print("No data") 
    else: 
     for count, lst in results: 
      s = pretty_print_lst(lst) 
      print(s) 

lst = [ (8, 'a'), (8, 'b'), (2, 'c'), (8, 'd')] 
print_rec(lst) 

Мы используем словарь для сбора предметов с одинаковым подсчетом. Это «defaultdict»; всякий раз, когда мы ссылаемся на ключ, который не существует, он создается в этом случае с пустым списком. Таким образом, мы можем просто добавлять значения, и не имеет значения, был ли дикт пустым или нет.

Затем мы собираем ненулевые элементы и составляем список, а затем довольно печатаем списки в соответствии с вашим желаемым форматом.

Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.

+0

Мое выборочное данные могут быть немного обманчивыми. Zeroes может быть разбросано по любой из вышеперечисленных таблиц, и его значения возвращаются как любые другие значения, за исключением случаев, когда у вас есть все 4 записи как ноль, поэтому я не хочу вырезать нули, просто распечатайте отдельный ответ, если все записи равны нулю. Не уверен, что это изменит код. Кроме того, имеет значение, является ли таблица dbf или csv для работы этого кода? – user12059

+0

Кроме того, иногда в моей попытке для краткости (кто хочет прочитать роман), я могу опустить важные детали (хотя они не кажутся важными в то время, поскольку я полагаю, что могу изменить текст). Снимите четвертый стол. Результат на самом деле будет больше похож: «Буква d имеет 1 заказ. Буквы a и b имеют по 3 ордера каждая. Буква c имеет 10 заказов». В таблице 1 будет указано что-то вроде: «На этой неделе нет заказов». – user12059

+0

Я изменил код так, чтобы он обрабатывал нули по мере запроса. Я также добавил комментарии, чтобы помочь вам разобраться. Что касается изменений выходного текста, вы должны отредактировать код и сделать вывод так, как вы хотите. Я уверен, что вы можете выяснить, как внести необходимые изменения, и я отвечу на вопросы. – steveha