【问题标题】:assigning scores for dictionary values为字典值分配分数
【发布时间】:2022-01-10 23:40:45
【问题描述】:

我需要一些帮助来计算字典值的分数。

考虑下面的字典,其中键是玩家 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,这就是玩家所用的。

【问题讨论】:

  • 从你的描述中很难理解你的代码在做什么:计算一些排名的总和,或者其他什么。你必须显示player.values()的价值,我们不能关注for val in player.values(): ... allValues = list(val) ... range = set(allValues)部分。此外,range 是一个内置函数,不要重新分配,将该变量称为其他变量。
  • 另外,您的标题令人困惑:字典没有“索引”,不像列表。你能修正你的标题吗?字典有键和值。似乎每个键的“值”是一个排名列表,然后您希望将其转换为权重。你知道i == value[-1]: 正在测试value 中的last 元素吗?
  • 是的,我 == value[-1]: 始终将最后一个值分配为 0。我现在将处理所有其他事情,谢谢 :)
  • 是否每个“值”都是长度为 4 的列表?否则,某些解决方案将失败。
  • 这些值是什么意思?球员人数排名?或者是其他东西。它们可以包含重复项吗?其他整数,如 0,5,6?它们是长度为 4 的意义是什么?帮助我们帮助您...

标签: python dictionary


【解决方案1】:

如果你替换,你可以把第二个循环写得简洁一点

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}

【讨论】:

    【解决方案2】:

    您可以注意到的一件事是您递增z 的值与i 的索引的总和为3。因此,您可以只减去i 的索引值而不是if-elifs,然后将其添加到z

    另外,我注意到设置range 的第一个for 循环仅分配播放器字典中的最后一个值,但它仍然运行正确,因为只有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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2020-11-04
      • 2018-10-24
      • 2021-04-02
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多