Сплит массив похожих номеров - PullRequest
0 голосов
/ 23 марта 2020

Существует ли функция по умолчанию python, позволяющая разделять группы чисел без использования обычного l oop?

inputArray=["slide_0000_00.jpg",
 "slide_0000_01.jpg",
 "slide_0000_02.jpg",
 "slide_0001_01.jpg",
 "slide_0001_02.jpg",
 "slide_0002_01.jpg"]

resultArray=
[["slide_0000_01.jpg", "slide_0000_02.jpg", "slide_0000_03.jpg"], 
 ["slide_0001_01.jpg", "slide_0001_02.jpg"],
 ["slide_0002_01.jpg"]]

1 Ответ

3 голосов
/ 24 марта 2020

используйте itertools.groupby для группировки последовательных элементов по средней части:

inputArray=["slide_0000_00.jpg",
 "slide_0000_01.jpg",
 "slide_0000_02.jpg",
 "slide_0001_01.jpg",
 "slide_0001_02.jpg",
 "slide_0002_01.jpg"]

import itertools

result = [list(g) for _,g in itertools.groupby(inputArray,key = lambda x:x.split("_")[1])]

, что дает:

>>> result
[['slide_0000_00.jpg', 'slide_0000_01.jpg', 'slide_0000_02.jpg'],
 ['slide_0001_01.jpg', 'slide_0001_02.jpg'],
 ['slide_0002_01.jpg']]

обратите внимание, что если группы не следуйте, группировка не будет работать (если вы сначала не отсортируете список, здесь будет работать простая сортировка, но сложность не удовлетворительная). Классическая альтернатива c в этом случае заключается в использовании collections.defaultdict(list):

import collections

d = collections.defaultdict(list)

for x in inputArray:
    d[x.split("_")[1]].append(x)

result = list(d.values())

результат идентичен (порядок может варьироваться, в зависимости от версии python и если словари сохраняют порядок. Вы можете ожидайте, что свойство от версии 3.5)

...