0

Python 2.6.2 を使用しています。pair2 つのネストされた条件を使用して並べ替えたいタプルのリストがあります。

  1. タプルは、最初に の降順でソートされますfwd_count
  2. count の値が の複数のタプルで同じ場合、fwd_countカウントが等しいタプルだけを の値に基づいて降順に並べ替える必要がありますrvs_count
  3. fwd_counta) タプルがとで同じカウントを持っている場合rvs_count、または a) タプルが で同じカウントを持っていて にfwd_count存在しない場合、順序は重要ではなく、配置は無視できます。rvs_count

私は次のコードを書くことができました:

pair=[((0, 12), (0, 36)), ((1, 12), (0, 36)), ((2, 12), (1, 36)), ((3, 12), (1, 36)), ((1, 36), (4, 12)), ((0, 36), (5, 12)), ((1, 36), (6, 12))]

fwd_count = {}
rvs_count = {}

for link in sorted(pair):  
    fwd_count[link[0]] = 0
    rvs_count[link[1]] = 0

for link in sorted(pair):  
    fwd_count[link[0]] += 1
    rvs_count[link[1]] += 1

#fwd_count {(6, 12): 1, (5, 12): 1, (4, 12): 1, (1, 36): 2, (0, 36): 2}
#rvs_count {(3, 12): 1, (1, 12): 1, (1, 36): 2, (0, 12): 1, (2, 12): 1, (0, 36): 1}

fwd_count_sort=sorted(fwd_count.items(), key=lambda x: x[1], reverse=True)
rvs_count_sort=sorted(rvs_count.items(), key=lambda x: x[1])

#fwd_count_sort [((1, 36), 2), ((0, 36), 2), ((6, 12), 1), ((5, 12), 1), ((4, 12), 1)]
#rvs_count_sort [((3, 12), 1), ((1, 12), 1), ((1, 36), 2), ((0, 12), 1), ((2, 12), 1), ((0, 36), 1)]

私が探している結果は次のとおりです。

#fwd_count_sort_final [((0, 36), 2), ((1, 36), 2), ((6, 12), 1), ((5, 12), 1), ((4, 12), 1)]

(1, 36)との位置が の(0, 36)位置から入れ替わっていfwd_count_sortます。

質問:

  1. fwd_countrvs_count情報を同時に使用して複数条件の並べ替えを行うより良い方法はありますか? (タプルのみが重要であり、ソート値を記録する必要はありません。)、または
  2. (上記のように)条件ごとに個別に並べ替え、必要な結果を得るために統合する手段を見つける必要がありますか?

現在、上記の項目 2 に取り組んでいますが、もっと簡単な方法があるかどうかを調べようとしています。

これは、 http: //stygianvision.net/updates/python-sort-list-object-dictionary-multiple-key/ で「数値を使用した双方向の並べ替え」を探しているものに最も近いものですが、できるかどうかはわかりません{tuple: {fwd_count : rvs_count}} 関係で新しい辞書を作成する場合に使用します。

更新: 2012 年 11 月 12 日 -- 解決済み

リストを使用してこれを解決することができました。以下はコードです。複数条件リストのソートに取り組んでいる人に役立つことを願っています。

#pair=[((0, 12), (0, 36)), ((1, 12), (1, 36)), ((2, 12), (0, 36)), ((3, 12), (1, 36)), ((1, 36), (4, 12)), ((0, 36), (5, 12)), ((1, 36), (6, 12))]

rvs_count = {}
fwd_count = {}

for link in sorted(pair):
  rvs_count[link[0]] = 0
  fwd_count[link[1]] = 0

for link in sorted(pair):
  rvs_count[link[0]] += 1
  fwd_count[link[1]] += 1

keys = []
for link in pair:
    if link[0] not in keys:
        keys.append(link[0])
    if link[1] not in keys:
        keys.append(link[1])

aggregated = []
for k in keys:
    a = -1
    d = -1
    if k in fwd_count.keys():
        a = fwd_count[k]
    if k in rvs_count.keys():
        d = rvs_count[k]
    aggregated.append(tuple((k, tuple((a,d)) )))

def compare(x,y):
    a1 = x[1][0]
    d1 = x[1][1]
    a2 = y[1][0]
    d2 = y[1][1]
    if a1 > a2:
        return  - a1 + a2
    elif a1 == a2:
        if d1 > d2:
            return d1 - d2
        elif d1 == d2:
            return 0
        else:
            return d1 - d2
    else:
        return - a1 + a2

s = sorted(aggregated, cmp=compare)
print(s)

j = [v[0] for v in s]
print(j)

私の作品にコメントをくれた Andre Fernandes、Brian、Duke に感謝します。

4

2 に答える 2

1

(ペアの)すべての最初の要素( and だけでなく)(1, 36)を交換する必要がある場合は、次の(0, 36)ことができます fwd_count_sort=sorted(rvs_count.items(), key=lambda x: (x[0][1],-x[0][0]), reverse=True)

于 2012-11-12T00:49:23.670 に答える
0

並べ替え基準の定義については正確にはわかりませんが、これは と の値に従ってリストを並べ替える方法pairです。これを使用して、希望する結果を得ることができれば幸いです。fwd_countrvs_count

def keyFromPair(pair):
    """Return a tuple (f, r) to be used for sorting the pairs by frequency."""
    global fwd_count
    global rvs_count

    first, second = pair
    countFirstInv = -fwd_count[first] # use the negative to reverse the sort order
    countSecond   = rvs_count[second]

    return (first, second)

pairs_sorted = sorted(pair, key = keyFromPair)

基本的な考え方は、Python の組み込みのタプル順序付けメカニズムを使用して複数のキーでソートし、タプル内の値の 1 つを反転して逆順ソートにすることです。

于 2012-11-12T00:43:02.817 に答える