Как сгруппировать двумерный список по ключу с условием? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть этот код:

from itertools import groupby
a = [[1,'n'],[2,'n'],[3,'n'],[4,'d'],[5,'n']]
b = [list(group) for key, group in groupby(a, lambda x: x[1] if x[1]=='n' else None)]
print(b)

Вывод:

[[[1, 'n'], [2, 'n'], [3, 'n']], [[4, 'd']], [[5, 'n']]]

Ожидаемый вывод:

[[[1, 'n'], [2, 'n'], [3, 'n']], [[5, 'n']]]

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы положили if в неправильном месте.Это должен быть фильтр для понимания списка, а не часть функции groupby.

>>> [list(group) for key, group in groupby(a, lambda x: x[1]) if key=='n']
[[[1, 'n'], [2, 'n'], [3, 'n']], [[5, 'n']]]
0 голосов
/ 21 декабря 2018

Находит самую длинную группу, не зная, что 'n' будет ей:

a = [[1,'n'],[2,'n'],[3,'n'],[4,'d'],[5,'n'],[6,'q'],[6,'q'],[6,'q'],[6,'q'],[6,'q']]

k = max( (list(grp) for key,grp in groupby(a,lambda x:x[1])), key=len)  
print(k)

Вывод:

[[6, 'q'], [6, 'q'], [6, 'q'], [6, 'q'], [6, 'q']]

Если есть две группы одинаковой длины, первая(независимо от 2-го элемента).


Это "развернутый" вариант, предназначенный для поиска самой длинной группы элементов с 'n' в качестве второго элемента - с использованием max () :

a = [[1,'n'],[2,'n'],[3,'n'],[4,'d'],[5,'n']]

result = [[]]
for e in a:
    if e[1] == 'n':             # if 'n' 2nd element, add to list
        result[-1].append(e)
    elif result[-1]:
        result.append([])       # if not, append new sublist

longest = max(result, key=len)  # get the longest one from all lists

print(longest)

Вывод:

[[1, 'n'], [2, 'n'], [3, 'n']]

Доку:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...