我需要一些幫助來計算字典值的分數。
考慮以下字典,其中鍵是玩家 ID(來自 1,2...N 的整數),值是排名串列(即,在某些排列中來自 1,2,...,N 的不同整數)。N=4 的示例:
player = {1: [4, 2, 1, 3], 2: [4, 3, 1, 2], 3: [4, 3, 1, 2], 4: [1, 3, 4, 2], 5: [2, 3, 4, 1], 6: [2, 1, 3, 4]
我使用以下代碼來分配所需的分數,y[i]如下所示:
y = {}
for val in player.values():
allValues = list(val)
uniqueRank = set(allValues)
for i in uniqueRank:
z = 0
for value in player.values():
if i == value[-1]:
z = 0
elif i == value[0]:
z = 3
elif i == value[1]:
z = 2
elif i == value[2]:
z = 1
y[i] = z
print(y)
然后,這給了我以下分數,這些分數是正確的,也是我想要的:
{1: 8, 2: 8, 3: 9, 4: 11}
但是,我想簡化此代碼,自動將值分配給 z 而不是if..elif子句:
elif i == value[1]:
z = 2
例如。
編輯:組件
for val in player.values():
allValues = list(val)
uniqueRank = set(allValues)
只是從上面的字典中獲取唯一值,所以在這方面它只是收集 1-4,這就是玩家所用的。
uj5u.com熱心網友回復:
如果您替換,您可以簡潔地撰寫第二個回圈
if i == value[-1]:
z = 0
elif i == value[0]:
z = 3
elif i == value[1]:
z = 2
elif i == value[2]:
z = 1
和
for j, val in enumerate(value):
if val == i:
z = 3-j
整個代碼作為字典理解:
y = {i: sum((3-j for value in player.values() for j, val in enumerate(value) if val == i)) for i in set([v for value in player.values() for v in value])}
輸出:
{1: 8, 2: 8, 3: 9, 4: 11}
uj5u.com熱心網友回復:
您可以注意到的一件事是您要遞增的值與加起來z的索引的總和3。因此,您可以代替s 減去in 值的索引并將其添加到.iif-elifiz
另外,我注意到for設定唯一的第一個回圈range分配了播放器字典中的最后一個值,但它仍然運行正確,因為只有 4 個值(1、2、3、4)被重復,因此我稍微修改了代碼一點點,像這樣……
player = {1: [4, 2, 1, 3], 2: [4, 3, 1, 2], 3: [4, 3, 1, 2], 4: [1, 3, 4, 2], 5: [2, 3, 4, 1], 6: [2, 1, 3, 4]}
y, setAllValues = {}, set([val for lstval in player.values() for val in lstval])
for i in setAllValues:
z = 0
for value in player.values():
z = (3 - value.index(i))
y[i] = z
print(y)
輸出:-
{1: 8, 2: 8, 3: 9, 4: 11}
Executed in 4.9591064453125e-05 seconds
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410042.html
標籤:
