0

プレーヤー = [各 ID が一意である (id, float) タプルの長いリスト、浮動小数点数が高い順]

on_teams = [一意の ID のリスト、すべての on_teams ID もプレーヤー リストに含まれる]

picked = set(on_teams)
best_remaining = []
for best_player in players:
    if best_player[0] not in picked:
        best_remaining.append(best_player)
    if len(best_remaining) == 5: break

「残りのベスト 5 人のプレイヤーを獲得する」などの単純なことを行うために 6 行のコードを使用する場合、もっとエレガントで Pythonic なソリューションはないのではないかと思います。これは単純な問題であることは間違いありませんが、それをコーディングするためのより良い方法はありますか?

更新: 私のコードは 100,000 回実行され、0.24 秒で実行されます。私が実行すると:

best_remaining = [(id, float) for id, float in players if id not in picked][:5]

コードは 4.61 秒 (100,000x) で実行されます。そのため、コードはより見栄えがよく、スキャンしやすくなりますが、リスト全体を作成してからスライスします。だから今、私の質問は少し異なります。速度を制約として、「残りのベスト 5 選手」の検索をコード化するより良い方法はありますか?

アップデート:

best_remaining = list(islice((p for p in players if p[0] not in picked), 5))

このコードは、私のコードよりもわずかに長く実行されます。少なくとも私にとっては、リスト内包表記の価値があります。そして何よりも、コードの習慣に取り組むのに適した場所を示してくれます。ありがとう

4

2 に答える 2

3

ジェネレーターを使用しisliceて、最大 5 つの結果に...

from itertools import islice
picked = set(on_teams)
players = list(islice((p for p in players if p[0] not in picked), 5))
于 2013-02-25T16:28:17.023 に答える
0

numpy はこのようなものに最適です

players = numpy.array([[1,1.1],[2,1.2],[3,3.2],[4,4.4]])
on_teams = [1,3]
print players[~numpy.in1d(players[:,0],on_teams)]  #all players not on teams (in example 2,4)
# now you can just select the top n players
于 2013-02-25T16:28:06.377 に答える