我有一个列表,其中包含大小不等的元素(有些甚至是空的),由:
a1 = [array([[83, 84]]), array([[21, 24], [32, 53],[54, 56]]), array([[21,24],[32, 37],[45, 46]]), [], []]
在此列表中,值可以成对(在数组内),也可以为空。我要做的就是根据所有对的降序对它们进行排序,并将它们的位置/索引保留在原始列表中(即a1
)。例如,我想要的输出是:
a1_sorted = [[32,53],[32,37],[21,24],[21,24],[54,56],[45,46],[83,84],[],[]]
a1_index = [[1,1],[2,1],[1,0],[2,0],[1,2],[2,2],[0,0],[3,0],[4,0]]
由于空元素没有2D位置,因此以下内容仅指示元素的第一个索引也是一种合适的选择:
a1_index = [1,2,1,2,1,2,0,3,4]
简单地遍历列表项是我的最初方法,但是处理空元素和变化尺寸会减慢这项工作。对最佳解决方案有什么想法?
答案 0 :(得分:2)
您可以使用enumerate
来为列表和子列表生成索引,然后使用列表推导来生成与它们的索引一起作为对的元组,以对它们进行排序以进行输出,并解压缩为两个不同的变量,如需要:
a1_sorted, a1_index = zip(*sorted(((t, [i, j])
for i, l in enumerate(a1) for j, t in enumerate(list(l) or [[]])),
key=lambda t: -abs(t[0][1] - t[0][0]) if len(t[0]) else 0))
a1_sorted
将变为:
[[32, 53], [32, 37], [21, 24], [21, 24], [54, 56], [83, 84], [45, 46], [], []]
a1_index
将变为:
[[1, 1], [2, 1], [1, 0], [2, 0], [1, 2], [0, 0], [2, 2], [3, 0], [4, 0]]
答案 1 :(得分:0)
您可以尝试此代码。但是,无法获得空列表
import numpy as np
import pandas as pd
# the data
a1 = [np.array([[83, 84]]), np.array([[21, 24], [32, 53],[54, 56]]),
np.array([[21,24],[32, 37],[45, 46]]), np.array([]),
np.array([])]
# create a data frame to store data in
df = pd.DataFrame(columns=['pair', 'index', 'difference'])
for j, item in enumerate(a1):
a = item.ravel() # convert 2d array to 1d array
for i in range(len(a)//2):
difference = a[i*2+1] - a[i*2]
pair = [a[i*2], a[i*2+1]]
index = [j, np.where(np.all(item==pair,axis=1))[0]]
df.loc[len(df)] = [pair, index, difference]
df.sort_values(by='difference', ascending=False, inplace=True) # sort based on diff
print(df)
pair index difference
2 [32, 53] [1, [1]] 21
5 [32, 37] [2, [1]] 5
1 [21, 24] [1, [0]] 3
4 [21, 24] [2, [0]] 3
3 [54, 56] [1, [2]] 2
0 [83, 84] [0, [0]] 1
6 [45, 46] [2, [2]] 1
a1_sorted = df['pair'].tolist()
print(a1_sorted)
[[32, 53], [32, 37], [21, 24], [21, 24], [54, 56], [83, 84], [45, 46]]