我可以在两个不同的列上进行条件排序,但是根据次要条件反转两列的顺序吗?

时间:2018-06-18 18:05:47

标签: python list sorting

编辑:自写这篇文章以来,我记得第三个必要条件。也就是说,如果索引1(时间)处的值之间的差异大于或等于2,则应该通过索引1(时间)列正常地对行进行排序。因此,因为B的时间值是6并且T的时间为5的差值在2之内,所以B应该在T之后。但是,对于T和K,例如,因为K的7值比5的大2。 T,T的值应该是第一个。

我们说我有这个数组

input = [['user_id', 'time', 'address'], 
    ['F', 5, 5], 
    ['T', 5, 8],
    ['B', 6, 6], 
    ['K', 7, 7], 
    ['J', 7, 9], 
    ['M', 9, 10]]

我想对行进行排序 - 首先按索引1(时间)按升序排序。然而,其次,如果给定user_id的索引2(地址),例如' B'小于另一个用户的索引2(地址),例如' T',我喜欢user_id' B'来自user_id' T'。

所以最终输出看起来像这样:

output = [['user_id', 'time', 'address'], 
        ['F', 5, 5],
        ['B', 6, 6]
        ['T', 5, 8],
        ['K', 7, 7], 
        ['J', 7, 9], 
        ['M', 9, 10]]

如果可能的话,我想在没有熊猫的情况下这样做。

2 个答案:

答案 0 :(得分:2)

>>> import functools
>>> 
>>> def compare(item1, item2):
...     return item1[1]-item2[1] if item1[1]-item2[1] >=2 else item1[2]-item2[2]
... 
>>> 
>>> output = [input[0]] + sorted(input[1:], key = functools.cmp_to_key(compare))
>>> pprint (output)
[['user_id', 'time', 'address'],
 ['F', 5, 5],
 ['B', 6, 6],
 ['T', 5, 8],
 ['K', 7, 7],
 ['J', 7, 9],
 ['M', 9, 10]]
>>> 

答案 1 :(得分:-2)

对于内置函数sorted,您可以提供自定义key方法。如果key方法返回第1列和第2列的元组,那么它就足够了,所以首先考虑第1列的值,对于该列中具有相同值的行,将按第2列排序。 / p>

data = [['user_id', 'time', 'address'],
    ['F', 5, 5],
    ['B', 6, 6],
    ['T', 5, 8],
    ['K', 7, 7],
    ['J', 7, 9],
    ['M', 9, 10]]

data_sorted = [data[0]] + sorted(data[1:], key = lambda row: (row[1], row[2]))