1

理想情况下 sort() 函数是多态性的极好例子。在 sort() 函数的情况下,您几乎可以用它对任何东西进行排序。

In [27]: b
Out[27]: [3, 4, 5, 6]

In [28]: b = ['a','b',5,6,None]

In [29]: b.sort()

In [30]: b
Out[30]: [None, 5, 6, 'a', 'b']

In [31]: b = ['a','b',23,'c',None,5j]

In [32]: b.sort()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/dubizzle/webapps/django/dubizzle/<ipython-input-32-fc40da74ac51> in <module>()
----> 1 b.sort()

TypeError: no ordering relation is defined for complex numbers

但似乎在虚数的情况下 sort() 函数失败。请注意,我收到此错误TypeError: no ordering relationship is defined for complex numbers

所以我的问题是

  1. 这个顺序到底是在哪里定义的?sort() 函数如何在内部工作?
  2. 是否有任何目的为复数保留这种排序关系,或者它只是像我们在 c 语言中没有幂运算符一样被遗漏了(一个错误)
  3. 我们如何对python中的虚数(复数)进行排序?我们有pythonic的方式来做到这一点吗?
4

2 回答 2

2

用数学术语来说,复数的集合不可能是完全有序的集合;为它们定义订单需要您提供一个可以订购它们的密钥。这取决于你想要什么:你想按它们的真实值排序吗?

b.sort(key=lambda complex_: complex_.real)

通过他们的想象值?

b.sort(key=lambda complex_: complex_.imag)

按它们的大小?

b.sort(key=lambda complex_: sqrt(complex_.real**2 + complex_.imag**2))

无论您想对它们进行排序,您都可以使用 key 关键字指定一个函数来比较元素。

于 2012-07-31T06:52:45.260 回答
1

您可以通过这种方式按实部或虚部排序:

>>> x = [(1+2j),(2+3j),(2+1j),(7+4j),(2+2j)]
>>> sorted(x, key=lambda x: x.real)
[(1+2j), (2+1j), (2+2j), (2+3j), (7+4j)]
>>> sorted(x, key=lambda x: x.imag)
[(2+1j), (1+2j), (2+2j), (2+3j), (7+4j)]

或者:

>>> sorted(x, key=lambda x: (x.real, x.imag))
[(1+2j), (2+1j), (2+2j), (2+3j), (7+4j)]

复数没有自然排序,因此您必须指定要以何种方式对它们进行排序。

于 2012-07-31T06:48:26.207 回答