LINUX.ORG.RU

Группировка по нескольким значениям

 


0

1

Уважаемые разработчики, подскажите как правильно реализовать группировку по двум полям на python2?

На C# в mono я сделал бы это так:

class Record
{
        public int i;
        public bool f;
        public string data;
        public Record(int _i, bool _f, string _data)
        {
                i = _i;
                f = _f;
                data = _data;
        }
}

public static void Main (string[] args)
{
        var array = new []
        {
                new Record(0, true, "A"),
                new Record(1, false, "B"),
                new Record(0, true, "C"),
                new Record(9, false, "D"),
                new Record(1, false, "E"),                      
        };
        
        var groups = from record in array
                                    group record by new { record.i, record.f };
        
        foreach (var g in groups)
                Console.WriteLine("i = {0}, f = {1}, records: {2}", g.Key.i, g.Key.f, string.Join(", ", g.Select(record=>record.data).ToArray()));              
}

В результате:

i = 0, f = True, records: A, C
i = 1, f = False, records: B, E
i = 9, f = False, records: D

На python2:

class Record:
    def __init__(self, i, f, data):
        self.i = i;
        self.f = f;
        self.data = data;
        
array = [Record(0, True, "A"),
         Record(1, False, "B"),
         Record(0, True, "C"),
         Record(9, False, "D"),
         Record(1, False, "E")]

# ???
★★★

Последнее исправление: omegatype (всего исправлений: 1)

Ответ на: комментарий от AIv

да, если только напечатать:

result = {}
for r in array : result.setdefault( (r.i,r.f), [] ).append(r.data)
for k, L in result.items() : print 'i =', k[0], 'f =', k[1], 'records:', ', '.join(L)

AIv ★★★★★
()
Ответ на: комментарий от shty

Зато в нём строчку «group record by new { record.i, record.f };» можно просто натурально прочесть как «группировать запись по новому объекту record.i, record.f». Хотя тут следует иметь априорные знания о том, что есть new. В тоже время «setdefault» никак не читается - необходимо знать поведение этого метода из документации. P.S. Меня так же удивило почему setdefault, а не set_default, казалось в не принято python использовать названиеметодоводнусьтрокубезразделителей.

omegatype ★★★
() автор топика
Ответ на: комментарий от shty

через чур многословный, и не по делу

Бей C# в решетку!

anonymous
()
Ответ на: комментарий от omegatype

Зато в нём строчку «group record by new { record.i, record.f };» можно просто натурально прочесть как «группировать запись по новому объекту record.i, record.f».

ИМНО прикручивать на каждый потенциальный пук свою синтаксическую конструкцию как то некамильфо...

AIv ★★★★★
()
        var groups = from record in array
                                    group record by new { record.i, record.f };

У меня ещё не дошли руки изучить сишарп, а он уже разросся до такого абсурда.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.