如何将字典中的列表项与Python中的另一个列表相乘

时间:2020-03-13 13:13:15

标签: python

我有一本包含玩家名称及其分数的字典,我需要做的是将每个列表项与另一个列表中的系数相乘,从而得到一个新的数组,该数组具有相乘的点数:

points = {mark : [650, 400, 221, 0, 3], bob : ([240, 300, 5, 0, 0], [590, 333, 20, 30, 0]), james : [789, 201, 0, 0, 1]}

coefficients = [5, 4, 3, 2, 1]

例如Mark:

player_points = [650*5, 400*4, 221*3, 0*2, 3*1]

还有鲍勃:

player_points = [240*5, 300*4, 5*3, 0*2, 0*1], [590*5, 333*4, 20*3, 30*2, 0*1]

以下是我尝试过的方法,但无论如何都无效:

def calculate_points(points, coefficients):
    i = 0
    for coefficient in coefficients:
        player_points = coefficient * points[i]
        i += 1

    return player_points


def main():
    points = {"mark": [650, 400, 221, 0, 3],
              "bob": ([240, 300, 5, 0, 0], [590, 333, 20, 30, 0]),
              "james": [789, 201, 0, 0, 1]}
    coefficients = [5, 4, 3, 2, 1]
    player_points = calculate_points(points, coefficients)
    print(player_points)

main()


3 个答案:

答案 0 :(得分:0)

您可以执行列表乘法

player_point = [i*j for i,j in zip(point['mark'], coefficients)]

因此,如果您想使用player_point词典:

 player_points = {}
 For name in points.keys():
   player_points[name] = [i*j for i,j in zip(points[name], coefficients)]

答案 1 :(得分:0)

以下是使用for循环的代码:

points = {"mark" : [650, 400, 221, 0, 3], "bob" : [240, 300, 5, 0, 0],"joe" : [590, 333, 20, 30, 0], "james" : [789, 201, 0, 0, 1]}
coefficients = [5, 4, 3, 2, 1]

for element in points:
    player_points= []
    for i in range(len(points.get(element))):
        player_points.append(points.get(element)[i]*coefficients[i])
    print(player_points)

这将给出

的输出
[3250,1600,663,0,3]
[1200,1200,15,0,0]
[2950,1332,60,60,0]
[3945,804,0,0,1]

答案 2 :(得分:0)

您的数据结构是不规则的,这使得处理起来比所需的要困难得多。如果所有字典值都是元组,则可以使用简单的字典理解。实际上,有时您需要一个数组,有时需要一个元组,这需要代码来处理异常和类型检测。

如果结构一致(即所有值的元组),这就是它的工作方式

points = { "mark"  : ([650, 400, 221, 0, 3],),
           "bob"   : ([240, 300, 5, 0, 0], [590, 333, 20, 30, 0]),
           "james" : ([789, 201, 0, 0, 1],)
         }
coefficients = [5, 4, 3, 2, 1]

player_points = { pl:tuple([p*c for p,c in zip(pt,coefficients)] for pt in pts) 
                  for pl,pts in points.items() }

print(player_points)

{
   'mark' : ([3250, 1600, 663, 0, 3],),
   'bob'  : ([1200, 1200, 15, 0, 0], [2950, 1332, 60, 60, 0]),
   'james': ([3945, 804, 0, 0, 1],)
}

如果您不想调整结构,则需要一个处理不一致的函数:

points = { "mark"  : [650, 400, 221, 0, 3],
           "bob"   : ([240, 300, 5, 0, 0], [590, 333, 20, 30, 0]),
           "james" : [789, 201, 0, 0, 1]
         }
coefficients = [5, 4, 3, 2, 1]

def applyCoeffs(pts,coeffs):
    if isinstance(pts,list):
        return [p*c for p,c in zip(pts,coeffs)]
    else:
        return tuple(applyCoeffs(pt,coeffs) for pt in pts)

player_points = { pl: applyCoeffs(pts,coefficients) for pl,pts in points.items() }

print(player_points)

{
  'mark' : [3250, 1600, 663, 0, 3], 
  'bob'  : ([1200, 1200, 15, 0, 0], [2950, 1332, 60, 60, 0]), 
  'james': [3945, 804, 0, 0, 1]
}