Python & Sorting:对复杂数组中的元素进行排序



我有一个复杂的数组;每个元素都有子元素,每个子元素都有子元素。我的阵列是;

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']]]

我该怎么做?你能给我一个解决方案吗?我在这里问了一个类似的问题,但现在我有更复杂的数组。

使用 collections.defaultdict

前任:

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

前任:

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) 

我会从您的数组中创建一个熊猫数据帧,并将其分组在日期列之后。然后,您可以将此数据帧转换回"复杂"数组。

供参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

代码片段:

df.groupby("date").apply(set)

最新更新