在列表中排序列表,保留索引?

2024-06-16 12:50:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,我想在其中对单个列表中的元素进行排序

Input:
[['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'C4P'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'JL1'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'K05'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'U2K'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'UE1'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'B30', 'C4P'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'B30', 'JL1'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'B30', 'K05'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'B30', 'U2K'],
['AKO', 'CGN', 'G80', 'K34', 'KI4', 'Z82', 'B30', 'UE1']]

Expected output:
[['AKO', 'C4P', 'CGN', 'G80', 'K34', 'KI4', 'Z82'],
['AKO', 'CGN', 'G80', 'JL1', 'K34', 'KI4', 'Z82'],
['AKO', 'CGN', 'G80', 'K05', 'K34', 'KI4', 'Z82'],
.......
.......
['AKO', 'B30', 'CGN', 'G80', 'K34', 'KI4', 'UE1', 'Z82']]

我可以使用for循环来实现这一点,但我想知道是否可以将其矢量化以获得更好的性能

尝试使用np.sort,但列表中的单个元素未排序


Tags: 元素列表排序ue1cgnu2kb30jl1
3条回答

如果您的数据是熊猫数据帧(因为您有熊猫标记)。您确实可以使用^{}。您需要用一些值填充NAN,在这里,我选择了'_'在末尾推送NAN

pd.DataFrame(np.sort(df.fillna('_').values, axis=1))

输出:

     0    1    2    3    4    5    6    7
0  AKO  C4P  CGN  G80  K34  KI4  Z82    _
1  AKO  CGN  G80  JL1  K34  KI4  Z82    _
2  AKO  CGN  G80  K05  K34  KI4  Z82    _
3  AKO  CGN  G80  K34  KI4  U2K  Z82    _
4  AKO  CGN  G80  K34  KI4  UE1  Z82    _
5  AKO  B30  C4P  CGN  G80  K34  KI4  Z82
6  AKO  B30  CGN  G80  JL1  K34  KI4  Z82
7  AKO  B30  CGN  G80  K05  K34  KI4  Z82
8  AKO  B30  CGN  G80  K34  KI4  U2K  Z82
9  AKO  B30  CGN  G80  K34  KI4  UE1  Z82

下面是一个更明确的例子:

输入:

np.random.seed(0)
df = pd.DataFrame(np.random.choice(list('ABCD')+[''], size=(5,5)))
   0  1  2  3  4
0     A  D  D  D
1  B  D  C     A
2  A     C  B  A
3  B  B  A  B   
4  D  A  D  A  C

输出:

pd.DataFrame(np.sort(df.replace('', '_').values, axis=1)).replace('_', '')
   0  1  2  3  4
0  A  D  D  D   
1  A  B  C  D   
2  A  A  B  C   
3  A  B  B  B   
4  A  A  C  D  D

你可以用下面的方法来做

res=[sorted(i) for i in yourList]
print(res)

除非您有大量的列表,并且有足够的处理能力并行使用,否则尝试将其矢量化并没有什么特别的优势。由于您是独立地对每个子列表进行排序,所以矢量化对您几乎没有好处。事实上,通过导入numpy而不是简单地使用sort的本机C实现,您可能会在包开销方面损失时间

相关问题 更多 >