Эффективный способ печати статистики, где отпечатки не должны дублироваться - PullRequest
0 голосов
/ 26 июня 2019

В моей программе есть список из 4 элементов, где данные отображаются таким образом ["Name", "Surname", "Base"("A" or "B"), "Description"]. Элементы отсортированы по имени. Я хотел бы напечатать их в стандартный вывод следующим образом:

Surname: surname
Name: name
Base: A
Description: etcetc

И если фамилия следующего предмета такая же, я бы хотел напечатать мой список:

Name: next_name
Base: A
Description: etcetcetc

Если имя, фамилия совпадают, а отличается только база, то должно быть:

Base: A
Description: etc

Если первые три элемента совпадают, следует добавить описание только к предыдущему отпечатку.

Я знаю, что это можно сделать с помощью множества операторов if, но для меня это выглядит ужасно. Это более эффективный способ сделать это в Python?

1 Ответ

1 голос
/ 26 июня 2019

Вы можете использовать groupby для группировки соседних элементов по общему признаку.Применяя это на каждом «уровне» ваших объектов, вы можете сделать что-то вроде:

from operator import itemgetter
from itertools import groupby

def groupby_attributes(l):
    for surname, surname_group in groupby(l, key=itemgetter(0)):
        print("Surname: {}".format(surname))
        for name, name_group in groupby(surname_group, key=itemgetter(1)):
            print("Name: {}".format(name))
            for base, base_group in groupby(name_group, key=itemgetter(2)):
                print("Base: {}".format(base))
                for description in map(itemgetter(3), base_group):
                    print("Description: {}".format(description))

groupby_attributes([
    ["surname1", "name1", "A", "Desc1"],
    ["surname1", "name1", "A", "Desc1"],
    ["surname1", "name1", "B", "Desc1"],
    ["surname1", "name2", "A", "Desc1"],
    ["surname2", "name1", "A", "Desc1"],
    ["surname2", "name1", "B", "Desc1"],
    ])

print

Surname: surname1
Name: name1
Base: A
Description: Desc1
Description: Desc1
Base: B
Description: Desc1
Name: name2
Base: A
Description: Desc1
Surname: surname2
Name: name1
Base: A
Description: Desc1
Base: B
Description: Desc1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...