2

たとえば、aはdict a = {1:2,2:3,3:4}、、、b= [3,1]

ソートしてタプルリストを取得したいのですaが、キーが入っている場合ab、の順序でソートし、bそうでない場合はタプルリストの最後に配置します。

私はこのようにします:

sorted(a.items(), key = lambda (k, v): b.index(k) if k in b else a.keys().index(k))

しかし、私はそれが間違っていると思います。

だから私はPythonを使ってそれを行うことができます。

ありがとう

4

4 に答える 4

4

これを試して:

import sys
sorted(a.items(), key = lambda (k, v): b.index(k) if k in b else sys.maxint)

にないキーについてはb、非常に大きな値を返します。これにより、ソートされた結果の最後にキーが配置されます。

于 2013-02-16T10:24:07.720 に答える
2

A good way to handle the special cases is to use tuples as the sort key

>>> a = {1: 2, 2: 3, 3: 4}
>>> b= [3, 1]
>>> sorted(a.items(), key=lambda (k,v):(0, b.index(k)) if k in b else (1,))
[(3, 4), (1, 2), (2, 3)]

if b is long, it's a good idea to create a dict to speed up the index lookups

>>> b_dict = {k:v for v, k in enumerate(b)}
>>> sorted(a.items(), key=lambda (k,v):(k not in b_dict, b_dict.get(k)))
[(3, 4), (1, 2), (2, 3)]
于 2013-02-16T10:35:23.467 に答える
0

あなたが望む期待される出力についてはわかりませんが、おそらくこれは役に立ちます:

a = {1:2,2:3,3:4}
b = [3,1]

r = [(x,a[x]) for x in b if x in a]

これはrリストとして与えます:

[(3, 4), (1, 2)]

これが期待される出力でない場合は、中間ステップとして役立つ可能性があります。

于 2013-02-16T10:22:04.143 に答える
0

私はこれがあなたが望むことをするだろうと思います:

a = {1:2,2:3,3:4}
b = [3,1]

print ([(k,a[k]) for k in b if k in a] +
       [(k,a[k]) for k in a if k not in b])

出力:

[(3, 4), (1, 2), (2, 3)]

これも機能します:

head, tail = [], []
any((head if k in b else tail).append((k,a[k]))
    for k in (b + [k2 for k2 in a if k2 not in b]))
print head+tail

私はそれをソートとは呼びませんa-多分それを注文します。

于 2013-02-16T10:33:06.407 に答える