4

次の形式の辞書をソートしようとしています。

d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124}

次の形式になるように、キーで並べ替えたいと思います。

+A, A, -A, +B, B, -B, etc

私は使用しようとしていますsorted(d, key=lambda x: (x[1], x[0]) if len(x) == 2 else x[0]) が、シンボルがASCIIチャートで正しい順序になっていないため、シンボルを正しくソートする方法が見つからないようです。私は何を間違っていますか?

4

3 に答える 3

7

それを行う1つの簡単な方法

rank = ['+A', 'A', '-A', '+B', 'B', '-B', ...]
sorted(d.items(), key=lambda i: rank.index(i[0]))

ランクが多い場合は、dict

rank = {'+A': 0, 'A': 1, '-A': 2, '+B': 3, 'B': 4, '-B': 5, ...}
sorted(d.items(), key=lambda i: rank[i[0]])

このようなラムダ関数を使用できます。文字が修飾子の前にソートされるようにするには、backward スライスを使用することが重要であることに注意してください。

sorted(d.items(), key=lambda i:(','+i[0])[::-1])

rankしかし、明示的なものはより明確であり、@Hari の回答のようなバグが発生しにくいと思います。(今のところバグに気付かずに5人が投票しました)

本当にソートされたキーが必要な場合(なぜですか?)、rank.getラムダ関数の代わりに単純に使用できます。

>>> rank = {'+A': 0, 'A': 1, '-A': 2, '+B': 3, 'B': 4, '-B': 5, '+C': 6, 'C': 7, '-C': 8}
>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124}
>>> sorted(d, key=rank.get)
['+A', 'A', '-A', '-B', '-C']

sortedしかし、おそらく完全にスキップする方が良いでしょう

>>> rank = ['+A', 'A', '-A', '+B', 'B', '-B', '+C', 'C', '-C']
>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124}
>>> [k for k in rank if k in d]
['+A', 'A', '-A', '-B', '-C']

それらすべてを入力するのが嫌いなら'

>>> rank = '+A A -A +B B -B +C C -C'.split()
于 2013-11-15T06:43:14.537 に答える
6

これはうまくいくはずです:

sorted(d, key=lambda x: (x[1], x[0]) if len(x) == 2 else (x[0], ','))

ascii 値はと,の間+にあるため、比較のために-ダミーを最後に置くことができます。,

>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124, '+B':1, 'B':98, '+C':232, 'C':23}
>>> sorted(d, key=lambda x: (x[1], x[0]) if len(x) == 2 else (x[0], ','))
['+A', 'A', '-A', '+B', 'B', '-B', '+C', 'C', '-C']

キーを逆にし,て、コンパレータに a を追加することもできます。

sorted(d, key=lambda x: x[::-1] + ',')

したがって、+A、A、-A はA+,Aおよびとして比較されA-,ます。

于 2013-11-15T06:53:36.190 に答える
1

私は次のように並べ替えます:

  • 文字だけ - 先頭を削除-+
  • +(-1)に別の重みを付けて最初に来る-ようにし、最後 (1) にするか、そうでない場合は 0 にします。

例えば:

sorted(d.iteritems(), key=lambda L: (L[0].lstrip('-+'), {'-': 1, '+': -1}.get(L[0][0], 0)))
# [('+A', 234), ('A', 454), ('-A', 124), ('-B', 212), ('-C', 991)]
于 2013-11-15T11:46:55.827 に答える