1

のようなタプルのリストがあります[(0, 34), (1, 77), (2, 6), (3, 60), (6, 2), (7, 5), (9, 13), (14, 2)]。タプルの順序を維持し、2 番目の要素を 0 から n - 1 までの整数で再列挙する必要があります。n はリストの長さです。結果は になります[(0, 4), (1, 6), (2, 2), (3, 5), (6, 0), (7, 1), (9, 3), (14, 0)]

私は、整数のペアではなく、整数のシーケンスを受け入れる関数を書き始めました。

def translation(seq):
    return [sorted(set(seq)).index(x) for x in seq]

>>> translate([34, 77, 6, 60, 2, 5, 13, 2])
[4, 6, 2, 5, 0, 1, 3, 0]

`

4

2 に答える 2

2

多分これ:

xs = [(0, 34), (1, 77), (2, 6), (3, 60), (4, 2), (5, 5), (6, 13)] 
secs = sorted(set(x[1] for x in xs))
res = [(x[0], secs.index(x[1])) for x in xs]
print res # [(0, 4), (1, 6), (2, 2), (3, 5), (4, 0), (5, 1), (6, 3)]

または1つの単一の理解(ただし、2次パフォーマンス):

res = [(x[0], sum(1 for y in xs if y[1] < x[1])) for x in xs]
于 2012-07-05T19:36:04.223 に答える
1

これを試して。教えていただいたコードを修正しましたので、わかりやすいと思います。

def translation(seq):
    return [(x[0], sorted(seq, key=lambda t: t[1]).index(x)) for x in seq]

使用例:

>>> translation([(0, 34), (1, 77), (2, 6), (3, 60), (6, 2), (7, 5), (9, 13)])
[(0, 4), (1, 6), (2, 2), (3, 5), (6, 0), (7, 1), (9, 3)]

sorted の key パラメータを使用すると、順序付けを行う関数を渡すことができます。この関数lambda t: t[1]により、各タプルの 2 番目の要素を順序付けに使用できます。

アップデート

ソリューションを更新したので、 をtranslation([(1, 8), (4, 9), (12, 8)])返します[(1, 0), (4, 1), (12, 0)]

def translation(seq):
    l = list(set(sorted([x[1] for x in seq])))
    return [(x[0], l.index(x[1])) for x in seq]
于 2012-07-05T20:05:33.433 に答える