如何在Python3中使用两个条件对对象进行排序?

时间:2015-09-28 13:48:16

标签: python sorting python-3.x

Alphabet Data List

  • 字母表表示列表中的对象。
  • 每个字母都有一个中心坐标(x,y)。
  • 该数字代表列表中的索引。

我想将项目按顺序排序[A,B,C,D]。所以...

if abs(A.y - B.y) < threshold:
    # sort by x coordinate
else:
    # sort by y coordinate

我可以通过手动检查对象并直接交换位置来完成此操作。

但是我如何使用Python3 sorted(key=)函数?

3 个答案:

答案 0 :(得分:4)

编写比较函数,然后使用functools.cmp_to_key将其转换为关键函数:

# Given a threshold, return a function suitable for
# use by old cmp argument
def comparator(threshold):
    def compare(A, B):
        if abs(A.y - B.y) < threshold:
            return cmp(A.x, B.x)
        else:
            return cmp(A.y, B.y)
    return compare

from functools import cmp_to_key
my_cmp = comparator(0.6)  # Or whatever threshold you need
sorted_list = sorted(my_list, key=cmp_to_key(my_cmp))

答案 1 :(得分:3)

根据python3文档:Sorting How To,您将定义一个复杂的比较函数,然后使用functools.cmp_to_key将其转换为关键函数:

这应该有效:

import functools
def comp_func(A,B):
    if abs(A.y - B.y) < threshold:
        return A.y - B.y # Sort by y co-ord
    else:
        return A.x - B.x # Sort by x co-ord

....
sorted(data, key=functools.cmp_to_key(comp_func))

答案 2 :(得分:-1)

sorted(your_list, key=lambda p: (p.x, p.y))