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

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

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.tee на сопрограмме?
  • xrange по сравнению с itertools.count Python 2.7
  • Python, генерирующий все неубывающие последовательности
  • Python itertools перестановки, как включить повторяющиеся символы
  • Когда лучше использовать zip вместо izip?
  • Создание всех возможных комбинаций во вложенном словаре
  • внедрение argmax в Python
  • Какой генератор itertools не пропускает никаких комбинаций?
  •  
    Interesting Posts for Van-Lav

    В чем смысл одиночного и двойного подчеркивания перед именем объекта?

    Правило зависимости пыталось заглушить первичный ключ в SQLAlchemy, когда ограничение внешнего ключа является частью составного первичного ключа

    целочисленная индексация целых чисел в нескольких измерениях

    Оптимизация расчета гравитации для частиц в пространстве с нулевой гравитацией 2d

    pip install pygraphviz: пакет libcgraph не найден

    Клиентские учетные данные не работают для API-интерфейса PowerBI REST

    По-видимому, импорт python ведет себя по-другому в файле mercurial_keyring.py

    render ('django.contrib.auth.views.login'), указывающий на другой URL, чем {% url 'django.contrib.auth.views.login'%}

    Как проверить, установлен ли аргумент из командной строки?

    Возможно ли кэшировать клиент pudon suds?

    Как можно надежно разбить строку на Python?

    Сообщение «API REST Twitter Twitter v1 больше неактивен. Перейдите на API v1.1 '

    Поиск элемента внутри элемента с использованием Selenium Webdriver

    Реализация Mergesort в Python

    Python Разрешение отклонено:

    Python - лучший язык программирования в мире.