排序列表列表并获取未排序列表

时间:2016-11-01 10:17:56

标签: python list sorting

这些是我需要在列表列表中执行的逻辑步骤

a = [[5,2],[7,4],[0,3]]
  1. 按照输出类似于

    的方式对列表列表进行排序
    7,5,4,3,2,0
    
  2. 获取原始列表中已排序元素的坐标,在这种情况下应该生成输出

    (1,0)
    (0,0)
    (1,1)
    (2,1)
    (0,1)
    (2,0)
    
  3. 我尝试以不同的方式使用sort, sortedargwhere,但我没有得到明智的结果,我想首先是因为sortsorted可以对列表进行排序一次只跟踪一个轴

5 个答案:

答案 0 :(得分:8)

创建一个字典,其中键为实际坐标,值为数字本身,如此

>>> a = [[5, 2], [7, 4], [0, 3]]
>>> positions = {
...     (idx1, idx2): col
...     for idx1, row in enumerate(a)
...     for idx2, col in enumerate(row)
... }
>>> positions
{(0, 1): 2, (2, 0): 0, (0, 0): 5, (1, 0): 7, (1, 1): 4, (2, 1): 3}

现在,根据它们的值对positions的键(坐标)进行排序,如此

>>> sorted(positions, key=positions.get, reverse=True)
[(1, 0), (0, 0), (1, 1), (2, 1), (0, 1), (2, 0)]

答案 1 :(得分:8)

此代码适用于列表列表。内部列表不必长度相同。

在每个级别,我们使用enumerate遍历列表以获取列表项及其索引。在顶层,每个项目是另一个列表,内部循环遍历每个列表以获取它们的索引和值,将索引(作为元组)存储在也包含该值的元组中。然后,我们对值的结果列表(b)进行排序,然后使用zip将其拆分为所有索引的元组和值的元组。

from operator import itemgetter

a = [[5, 2], [7, 4], [0, 3]]

b = [((i, j), v) for i, t in enumerate(a) for j, v in enumerate(t)]
b.sort(key=itemgetter(-1), reverse=True)
print(b)
coords, vals = zip(*b)
print(vals)
print(coords)

<强>输出

[((1, 0), 7), ((0, 0), 5), ((1, 1), 4), ((2, 1), 3), ((0, 1), 2), ((2, 0), 0)]
(7, 5, 4, 3, 2, 0)
((1, 0), (0, 0), (1, 1), (2, 1), (0, 1), (2, 0))

答案 2 :(得分:2)

您可以使用一系列列表推导和zip块,但可读性会受到影响:

n, idxs = zip(*sorted(zip([i for sl in a for i in sl], [(col, row) for col in range(len(a)) for row in range(len(a[col]))]), key=lambda x: x[0], reverse=True))

print n, idxs
>>> (7, 5, 4, 3, 2, 0) ((1, 0), (0, 0), (1, 1), (2, 1), (0, 1), (2, 0))

如果您需要dict,只需将zip(*..)图层替换为dict()

即可

答案 3 :(得分:2)

使用Numpy,在处理更大的数组时,这比普通的python代码要快得多:

In [21]: a = np.array([[5,2],[7,4],[0,3]])
In [22]: x, y = np.unravel_index((-a).argsort(axis=None), a.shape)

In [23]: indices = np.column_stack((x, y))

In [24]: indices
Out[24]: 
array([[1, 0],
       [0, 0],
       [1, 1],
       [2, 1],
       [0, 1],
       [2, 0]])

In [25]: a[x, y]
Out[25]: array([7, 5, 4, 3, 2, 0])

答案 4 :(得分:1)

您可以展平列表,然后使用它来排序和查找索引。

a = [[5,2],[7,4],[0,3]]
c = reduce(lambda x, y: x+y, a)
b = sorted(c, reverse=True)
for i in b:
    print c.index(i)/2, c.index(i)%2

输出:

1 0 
0 0
1 1
2 1
0 1
2 0