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 Order 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 に答える