Python & Sorting: сортировка элементов в сложном массиве - PullRequest
0 голосов
/ 11 апреля 2019

у меня сложный массив; каждый элемент имеет подэлементы, и каждый подэлемент имеет подэлементы. Мой массив:

myComplex=[[['03.04.2019', 'Jack', '7']], [['26.03.2019', 'Micheal', '5'], ['26.03.2019', 'Smith', '8']], [['01.04.2019', 'Jack', '11'], ['01.04.2019', 'Michelle', '2'], ['01.04.2019', 'George', '9']]]

Позвольте мне объяснить этот массив;

Подэлемент, начинающийся с '03 .04.2019 '; ['03.04.2019', 'Jack', '7']

Субэлемент, начинающийся с '26 .03.2019 '; ['26.03.2019', 'Micheal', '8'], ['26.03.2019', 'Smith', '5']

Подэлемент, начинающийся с '01 .04.2019 '; ['01.04.2019', 'Jack', '11'], ['01.04.2019', 'Michelle', '2'], ['01.04.2019', 'George', '9']

В myComplex выше, как вы видите, первым подэлементом каждого подэлемента является дата. Я хочу заказать эти субэлементы с их датами. Поэтому я хочу вывод, как это, когда я ввожу print(myComplex);

[[['26.03.2019', 'Micheal', '5'], ['26.03.2019', 'Smith', '8']], [['01.04.2019', 'Jack', '11'], ['01.04.2019', 'Michelle', '2'], ['01.04.2019', 'George', '9']], [['03.04.2019', 'Jack', '7']]]

Как я могу это сделать? Можете ли вы дать мне решение для этого? Я задал похожий вопрос в здесь , но теперь у меня есть более сложный массив.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Использование collections.defaultdict

Ex:

from collections import defaultdict

myComplex=[[['03.04.2019', 'Jack', '7']], [['26.03.2019', 'Micheal', '5'], ['26.03.2019', 'Smith', '8']], [['01.04.2019', 'Jack', '11'], ['01.04.2019', 'Michelle', '2'], ['01.04.2019', 'George', '9']]]
result = defaultdict(list) 
for i in myComplex:
    for j in i:
        result[j[0]].append(j)

print(result.values())

Выход:

[[['03.04.2019', 'Jack', '7']],
 [['26.03.2019', 'Micheal', '5'], ['26.03.2019', 'Smith', '8']],
 [['01.04.2019', 'Jack', '11'],
  ['01.04.2019', 'Michelle', '2'],
  ['01.04.2019', 'George', '9']]]

Использование itertools.groupby

Ex:

import datetime        
from itertools import groupby, chain

myComplex=[[['03.04.2019', 'Jack', '7']], [['26.03.2019', 'Micheal', '5'], ['26.03.2019', 'Smith', '8']], [['01.04.2019', 'Jack', '11'], ['01.04.2019', 'Michelle', '2'], ['01.04.2019', 'George', '9']]]
data = chain.from_iterable(myComplex)
result = [list(v) for k, v in groupby(sorted(data, key=lambda x: datetime.datetime.strptime(x[0], "%d.%m.%Y")), lambda x: x[0])]
pprint(result) 
0 голосов
/ 11 апреля 2019

Я бы создал фрейм данных pandas из вашего массива и сгруппировал его после столбца даты. Этот фрейм данных вы можете затем преобразовать обратно в «сложный» массив.

для справки: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

фрагмент кода:

df.groupby("date").apply(set)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...