Как группировать похожие элементы в списке?

Я хочу сгруппировать похожие элементы в списке на основе первых трех символов в строке. Например:

test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2'] 

Как я могу группировать перечисленные элементы списка в группы на основе первой группировки букв (например, 'abc' )? Ниже представлен предполагаемый результат:

 output = {1: ('abc_1_2', 'abc_2_2'), 2: ('hij_1_1',), 3: ('xyz_1_2', 'xyz_2_2')} 

или

 output = [['abc_1_2', 'abc_2_2'], ['hij_1_1'], ['xyz_1_2', 'xyz_2_2']] 

Я попытался использовать itertools.groupby для достижения этого без успеха:

 >>> import os, itertools >>> test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2'] >>> [list(g) for k.split("_")[0], g in itertools.groupby(test)] [['abc_1_2'], ['abc_2_2'], ['hij_1_1'], ['xyz_1_2'], ['xyz_2_2']] 

Я не рассмотрел следующие сообщения:

Как объединить похожие элементы в списке . В примере группируются аналогичные элементы (например, 'house' и 'Hose' ) с использованием подхода, слишком сложного для моего примера.

Как я могу группировать эквивалентные элементы вместе в списке Python? , Именно здесь я нашел идею для понимания списка.

One Solution collect form web for “Как группировать похожие элементы в списке?”

Часть .split("_")[0] должна находиться внутри функции с одним аргументом, которую вы передаете в качестве второго аргумента itertools.groupby .

 >>> import os, itertools >>> test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2'] >>> [list(g) for _, g in itertools.groupby(test, lambda x: x.split('_')[0])] [['abc_1_2', 'abc_2_2'], ['hij_1_1'], ['xyz_1_2', 'xyz_2_2']] >>> 

Наличие этого в части for ... не делает ничего, так как результат немедленно отбрасывается.


Кроме того, было бы немного более эффективно использовать str.partition когда вам нужен только один раскол:

 [list(g) for _, g in itertools.groupby(test, lambda x: x.partition('_')[0])] 

Демо-версия:

 >>> from timeit import timeit >>> timeit("'hij_1_1'.split('_')") 1.3149855638076913 >>> timeit("'hij_1_1'.partition('_')") 0.7576401470019234 >>> 

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

  • Декартово произведение, дающее словарь
  • Предотвращение ошибки памяти в itertools.permutation
  • Итерация по нескольким индексам с i> j (> k) в питоническом виде
  • Python itertools перестановки, как включить повторяющиеся символы
  • python itertools round robin без дублирования
  • Перечислите (элемент, другие) в списке
  • Объединить список в пары кортежей (x, y) - Python
  • Проверьте, равно ли два вложенных списка при замене
  • Python - лучший язык программирования в мире.