0

次を使用した結果の例として、2つの数値要素の結合された重み付けで並べ替えたい多次元リストがあります。sorted(results, key=operator.itemgetter(2,3))

[..,1,34]
...
...
[..,10,2]
[..,11,1]
[..,13,3]
[..,13,3]
[..,13,3]
[..,16,1]
[..,29,1]

itemgetterの問題は、最初に要素2で並べ替え、次に要素3で並べ替えることです。ここで、13.3を上/下に配置します(asc / descの並べ替えに依存します)。

これは可能ですか?可能であればどのように。

どうもありがとう

編集1。

鈍感でごめんなさい、私はdomデータ、検索ページからの結果を処理しています、それはいわば一般的な検索エンジンサーチャーです。

私が行っているのは、aタグとdivタグを見つけてから、特定のクラスまたはIDがdiv / aタグで発生するアイテムの数をカウントすることです。これは要素2です。次に、見つかったタグのリストを再度スキャンして、何を確認しますか。タグの他のクラス/IDは、処理中の現在のタグの合計と一致します。したがって、この場合、アイテム13、3は、そのタイプのタグのクラス/ IDに13の一致があり、3は、クラス/を持つ他のタグが3つあることを示します。 idは同じ回数発生するので、なぜそのように並べ替えたいのか、いいえ、それはdictではなく、間違いなくリストです。

ありがとうございました。

4

2 に答える 2

2

他に説明がないので、ここで完全に推測します。実際に実行しようとしているのは、リストの最後の2つのキーの積で並べ替え、次に、リストの最初の要素の大きさで並べ替えることです。製品(13,3)それが、なぜ最高の結果になるのかについて私が思いつくことができる唯一の説明です。

その場合、次のようなものを探します。

sorted(results, key=lambda x: (x[-2]*x[-1], x[-2]), reverse=True)

それはあなたに次のようなものを与えるでしょう:

[[13, 3], [13, 3], [13, 3], [1, 34], [29, 1], [10, 2], [16, 1], [11, 1]]

または、ここで実際に探しているのが、リストに表示される回数順に結果を並べ替えることである場合は、を使用できます collections.Counter。残念ながら、リストはハッシュ化できないため、少しごまかして、キーとして使用するタプルに変換します。これを回避する方法はいくつかありますが、これは私が今話していることを示すための最も簡単な方法です。

import collections, json
def sort_results(results):
    c = collections.Counter([tuple(k) for k in results])
    return sorted(c, key=lambda x: c[x], reverse=True)

これはあなたを取得します:

[(13, 3), (1, 34), (16, 1), (29, 1), (11, 1), (10, 2)]

タプルの代わりにタプルを使用できることを指摘してくれたJFセバスティアンに感謝しstrます!

于 2012-12-26T00:58:06.027 に答える
1

はい、キー関数として好きな関数を書くことができます。たとえば、2番目と3番目の要素の合計で並べ替える場合:

def keyfunc(item):
    return sum(operator.itemgetter(2, 3)(item))

sorted(results, key=keyfunc)

したがって、この関数を、として使用した場合keyfunc、リストの3番目の要素として2番目の要素3として13を持つアイテムは、値16であるかのようにソートされます。

これらの要素をどのように並べ替えるかは明確ではありませんが、本体を変更して、keyfunc必要な操作を実行できます。

于 2012-12-26T00:57:48.030 に答える