Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで行・列ごとに並べられた行列の全要素をソート順に出力する方法

行列(マトリックス)のすべての要素をソートされた順序で取得したいケースはよくあります。しかし、行列は行と列という2次元の形式で構成されているため、通常のソートアルゴリズムをそのまま適用することはできません。そこで、以下のようにユーザー定義関数を作成し、それを使って要素を並べ替えます。

ここで紹介するのはヒープソートを利用した手法です。まずheapq関数で配列をヒープ構造に変換(ヒープ化)し、続くSort関数で実際のソート処理を実行します。

コード例

def heapq(a, k, i):
    greater = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < k and a[i] < a[l]:
        greater = l
    if r < k and a[greater] < a[r]:
        greater = r
    if greater != i:
        a[i], a[greater] = a[greater], a[i]
        heapq(a, k, greater)

def Sort(val):
    n = len(val)
    for i in range(n, -1, -1):
        heapq(val, n, i)
    for i in range(n - 1, 0, -1):
        val[i], val[0] = val[0], val[i]
        heapq(val, i, 0)

x = [11, 3, 50, 75, 4, 32, 9, 2, 15]
Sort(x)
n = len(x)
print("Sorted values are")
for i in range(n):
    print("%d" % x[i])

上記のコードを実行すると、次のような結果が出力されます。

実行結果

Sorted values are
2
3
4
9
11
15
32
50
75

このように、行と列に分かれたデータであっても、一度フラットなリストとして扱えば、ヒープソートなどのアルゴリズムを適用することで、すべての要素を昇順に並べ替えることができます。heapq関数は親ノードと子ノードを比較しながら部分木をヒープ化する役割を担い、Sort関数は先頭要素(最大値)を末尾と交換しながらヒープを再構築することで、全体を昇順に整列させます。

  1. Pythonで指定セルの行・列を除いたマトリックス内の全要素の合計を求める方法

    2次元マトリックス(行列)と複数のセルインデックスが与えられたとき、それぞれのセルインデックスについて「その行と列に含まれる要素を除外した残りの全要素の合計」を計算する問題を考えてみましょう。セルインデックスは (i, j) の形式で表されます。ここで i は行番号、j は列番号を意味します。つまり、各セルインデックス (i, j) ごとに、i 行目および j 列目に存在する要素をすべて取り除き、それ以外の要素の合計を求めることになります。入力例たとえば、次のような3×3のマトリックスが与えられたとします。223457643このとき、セルインデックスが [(0, 0), (1, 1), (0,

  2. Pythonでリスト内の要素の相対的な順序(順位)を求める方法

    整数の要素を持つリストが与えられたとき、その要素同士の「相対的な順序」を求めることを考えます。これは、リストを昇順に並べ替えた場合に、各要素がどの位置(インデックス)に来るかを示すものです。例えば [78, 14, 0, 11] を昇順に並べると [0, 11, 14, 78] となるため、元の各要素の相対的な順位はそれぞれ [3, 2, 0, 1] となります。本記事では、この相対順序を求める2つの方法を紹介します。方法1:sorted() と index() を使うまずリスト全体を sorted() で並べ替え、その結果に対して各要素の index() を求めます。リスト内包表記を使えば、