players = [每个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
当我使用六行代码做一个简单的事情,比如“得到五个最好的剩余玩家”时,我想知道是否没有更优雅的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))
这段代码的运行时间比我的代码长得多。至少对我来说,它具有列表理解的价值。最重要的是,它为我提供了一个处理我的代码习惯的好地方。感谢
答案 0 :(得分: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))
答案 1 :(得分: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