根据公共字符串将列表排序为列表,同时保留整个列表

Posted

技术标签:

【中文标题】根据公共字符串将列表排序为列表,同时保留整个列表【英文标题】:Sort list into list based on common string while keeping entire list 【发布时间】:2021-10-06 02:09:33 【问题描述】:

我有一个如下所示的数据集:

old_data = [[0,0,0,X],[1,0,0,A],[2,0,0,HJ],[3,0,0,X],[4,0,0,A],[5,0,0,K],[6,0,0,K]

我希望能够将列表排序到他们自己的单独列表中,如下所示:

X_list = [[0,0,0,X],[3,0,0,X]]
A_list = [[1,0,0,A],[4,0,0,A]]
HJ_list = [[2,0,0,HJ]]
K_list = [[5,0,0,K],[6,0,0,K]]

我尝试使用 pandas 中的一些功能和堆栈上的其他一些解决方案,但是,它们都将特定值分组到一个列表中,这最终会删除列表中的所有其他数据。此外,将有 X 个列表 [3],因此需要生成 X 个列表。我之前尝试的是这样的:

values = sorted(set(map(lambda x: x[3], old_data)))
newlist = [[y[3] for y in old_data if y[3] == x] for x in values]

哪个输出,如下:

newlist = [[X,X],[A,A],[HG],[K,K]]

如果有办法重新排列上面的代码,也许可以保留所有数据并使用 for 循环创建 X 数量的列表?我不太了解上面的代码,所以我不知道该怎么做。否则,可能以某种方式使用熊猫?

【问题讨论】:

【参考方案1】:

你可以简单地使用itertools.groupby:

from itertools import groupby
old_data = [[0,0,0,'X'],
            [1,0,0,'A'],
            [2,0,0,'HJ'],
            [3,0,0,'X'],
            [4,0,0,'A'],
            [5,0,0,'K'],
            [6,0,0,'K']]

k: list(v) for k,v in groupby(sorted(old_data, key=lambda x: x[-1]), lambda x: x[-1])

输出:

'A': [[1, 0, 0, 'A'], [4, 0, 0, 'A']],
 'HJ': [[2, 0, 0, 'HJ']],
 'K': [[5, 0, 0, 'K'], [6, 0, 0, 'K']],
 'X': [[0, 0, 0, 'X'], [3, 0, 0, 'X']]

如果您想要自定义组名:

k+'_list': list(v)
 for k,v in groupby(sorted(old_data, key=lambda x: x[-1]),
lambda x: x[-1])
'A_list': [[1, 0, 0, 'A'], [4, 0, 0, 'A']],
 'HJ_list': [[2, 0, 0, 'HJ']],
 'K_list': [[5, 0, 0, 'K'], [6, 0, 0, 'K']],
 'X_list': [[0, 0, 0, 'X'], [3, 0, 0, 'X']]

【讨论】:

【参考方案2】:

假设您的 A、X 等是字符串,我们可以制作一个 dict,将键作为标签,将值作为列表。

我们遍历您的数据,并使用.setdefault 方法为我们尚未看到的任何键创建一个空列表。然后我们将您的列表附加到

old_data = [[0,0,0,'X'],[1,0,0,'A'],[2,0,0,'HJ'],[3,0,0,'X'],[4,0,0,'A'],[5,0,0,'K'],[6,0,0,'K']]

output = 
for i in old_data:
    output.setdefault(i[3]+'_list', []).append(i)
output

'X_list': [[0, 0, 0, 'X'], [3, 0, 0, 'X']],
 'A_list': [[1, 0, 0, 'A'], [4, 0, 0, 'A']],
 'HJ_list': [[2, 0, 0, 'HJ']],
 'K_list': [[5, 0, 0, 'K'], [6, 0, 0, 'K']]

【讨论】:

【参考方案3】:

从您的列表列表中创建一个Series,然后使用groupby 根据最后一个元素拆分它们。

import pandas as pd

s = pd.Series(old_data)
s.groupby(s.str[-1]).agg(list)

A     [[1, 0, 0, A], [4, 0, 0, A]]
HJ                 [[2, 0, 0, HJ]]
K     [[5, 0, 0, K], [6, 0, 0, K]]
X     [[0, 0, 0, X], [3, 0, 0, X]]
dtype: object

【讨论】:

以上是关于根据公共字符串将列表排序为列表,同时保留整个列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在保留顺序的同时删除列表中的重复元素?

如何在保留列表名称和值的同时展平一列列表? [r] [重复]

如何获取在 C++ 中排序后保留的列表元素的指针

如何在保留字符串形状的同时旋转字符串列表中的字母?

在 Java 中,如何根据另一个列表对一个列表进行排序?

python 一个函数,它接受一个列表并将其分成n个段,同时将它们排序为列表字典。