Группировать элементы длинного списка в python на основе имени элемента

1

У меня есть длинный список, подобный приведенному ниже, который я отсортировал на основе (element [0], element [3], element [2]) соответственно. Под элементом я подразумеваю цифры между подчеркиванием.

list3=['20180406_145813_4_1.jpg',
 '20180406_145813_5_1.jpg',
 '20180406_145813_6_1.jpg',
 '20180406_175827_10_12.jpg',
 '20180406_175827_11_12.jpg',
 '20180409_190651_7_2.jpg',
 '20180409_190651_8_2.jpg',
...]

Теперь я хочу разделить список на основе элемента [3]. Мой желаемый результат:

[['20180406_145813_4_1.jpg',
 '20180406_145813_5_1.jpg',
 '20180406_145813_6_1.jpg'],
 ['20180406_175827_10_12.jpg',
 '20180406_175827_11_12.jpg'],
 ['20180409_190651_7_2.jpg',
 '20180409_190651_8_2.jpg'],
...]

У меня есть этот код, который печатает каждое имя в виде списка. Я не знаю, как группировать по element3 в этом коде:

for imagename in list3:
    element3 = imagename.split("_")[3]
    for j,m in groupby(list3):
        print(list(m))
Теги:

2 ответа

3
Лучший ответ

Вы можете использовать itertools.groupby следующим образом:

from itertools import groupby

list3 = ['20180406_145813_4_1.jpg',
         '20180406_145813_5_1.jpg',
         '20180406_145813_6_1.jpg',
         '20180406_175827_10_12.jpg',
         '20180406_175827_11_12.jpg',
         '20180409_190651_7_2.jpg',
         '20180409_190651_8_2.jpg']

result = [list(group) for _, group in groupby(list3, key=lambda x: x.split('_')[3])]
print(result)

Выход

[['20180406_145813_4_1.jpg', '20180406_145813_5_1.jpg', '20180406_145813_6_1.jpg'], ['20180406_175827_10_12.jpg', '20180406_175827_11_12.jpg'], ['20180409_190651_7_2.jpg', '20180409_190651_8_2.jpg']]

Приведенное выше понимание списка эквивалентно следующему циклу for:

result = []
for _, group in groupby(list3, key=lambda x: x.split('_')[3]):
    result.append(list(group))
0

Попробуйте это (не импортируя ничего):

list3=['20180406_145813_4_1.jpg',
       '20180406_145813_5_1.jpg',
       '20180406_145813_6_1.jpg',
       '20180406_175827_10_12.jpg',
       '20180406_175827_11_12.jpg',
       '20180409_190651_7_2.jpg',
       '20180409_190651_8_2.jpg',
       ...]

res = []
for first, second, third in zip(*[iter(list3)]*3):
    res.append([first, second, third])

Просто добавьте список first, seconds, third в список res

print(res)

[['20180406_145813_4_1.jpg', '20180406_145813_5_1.jpg', '20180406_145813_6_1.jpg'], 
 ['20180406_175827_10_12.jpg', ...]]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню