如何从包含字典的列表中计算运行率?

2024-09-27 00:18:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在计算包含词典的列表的净运行率。 假设列表为:

score = [{'dismissal': 'run out (Hardik Pandya)', 'balls': '92', 'name': 'Amla', 'fours': '5', 'six': '0', 'runs': '71'}, 
{'dismissal': 'c Kohli    b Bumrah', 'balls': '32', 'name': 'Markram(c)', 'fours': '4', 'six': '1', 'runs': '32'}, 
{'dismissal': 'c Rohit    b Hardik Pandya', 'balls': '5', 'name': 'Duminy', 'fours': '0', 'six': '0', 'runs': '1'}
..........]

我试图计算这些值的NRR,这些值是动态的,它们不断变化,我尝试使用枚举,但我不知道如何进一步进行。你知道吗

  dic= {k+str(i): v for i, x in enumerate(score, 1) for k, v in x.items()}

这将为字典的键添加索引。在这之后我该怎么办?有没有其他方法可以做到这一点? 顺便说一下,要计算NRR公式是=(跑步/球)*100,任何帮助都会有所帮助。你知道吗

期望得到这样的结果:

dic = [{'dismissal1': 'run out (Hardik Pandya)', 'balls1': '92', 'name1': 'Amla', 'fours1': '5', 'six1': '0', 'runs1': '71','NRR1':'19.3'}, 
{'dismissal2': 'c Kohli    b Bumrah', 'balls2': '32', 'name2': 'Markram(c)', 'fours2': '4', 'six2': '1', 'runs2': '32','NRR2':'44.3'}, 
{'dismissal3': 'c Rohit    b Hardik Pandya', 'balls3': '5', 'name3': 'Duminy', 'fours3': '0', 'six3': '0', 'runs3': '1','NRR3':'45.3'}
..........]

Tags: runname列表runsoutscoresixballs
3条回答

也可以使用数据帧方法计算NRR:

import pandas as pd
ddf = pd.DataFrame(score)               # dictionary to dataframe
ddf.balls = ddf.balls.astype(int)       # convert string to integers
ddf.runs = ddf.runs.astype(int)
ddf['NRR']= 100 * ddf.runs / ddf.balls  # calculate NRR
print(ddf)               

输出:

   balls                   dismissal fours        name  runs six         NRR
0     92     run out (Hardik Pandya)     5        Amla    71   0   77.173913
1     32         c Kohli    b Bumrah     4  Markram(c)    32   1  100.000000
2      5  c Rohit    b Hardik Pandya     0      Duminy     1   0   20.000000

也可以转换为字典:

newdict = ddf.to_dict(orient='records')
print(newdict)

输出:

[{'dismissal': 'run out (Hardik Pandya)', 'NRR': 77.17391304347827, 'runs': 71, 'fours': '5', 'name': 'Amla', 'balls': 92, 'six': '0'}, 
{'dismissal': 'c Kohli    b Bumrah', 'NRR': 100.0, 'runs': 32, 'fours': '4', 'name': 'Markram(c)', 'balls': 32, 'six': '1'}, 
{'dismissal': 'c Rohit    b Hardik Pandya', 'NRR': 20.0, 'runs': 1, 'fours': '0', 'name': 'Duminy', 'balls': 5, 'six': '0'}]

对于保龄球经济(如评论中所问):

bowler= [ { "maidens": "0", "runs": "15", "overs": "4", "name": "D Willey*", "wickets": "2" }, { "maidens": "0", "runs": "32", "overs": "3", "name": "Jhye Richardson", "wickets": "2" } ]
ddf = pd.DataFrame(bowler)
ddf['economy'] = 100* ddf.runs.astype(int) / (ddf.overs.astype(int) * 6)
print(ddf)

输出:

  maidens             name overs runs wickets     economy
0       0        D Willey*     4   15       2   62.500000
1       0  Jhye Richardson     3   32       2  177.777778

你就快到了,只需要一行字就可以更新字典了。只需调整你的听写/列表理解如下:

dic= {k+str(i+1): v for i, x in enumerate(score, 1) for k, v in x.items()}

因为enumerate是0索引的,所以您可能需要添加str(i+1)

演示:

>>> score = [{'dismissal': 'run out (Hardik Pandya)', 'balls': '92', 'name': 'Amla', 'fours': '5', 'six': '0', 'runs': '71'}, {'dismissal': 'c Kohli    b Bumrah', 'balls': '32', 'name': 'Markram(c)', 'fours': '4', 'six': '1', 'runs': '32'}, {'dismissal': 'c Rohit    b Hardik Pandya', 'balls': '5', 'name': 'Duminy', 'fours': '0', 'six': '0', 'runs': '1'}]
>>> dic= [{k+str(i+1): v for k, v in x.items()} for i, x in enumerate(score)]
>>> dic
[{'balls1': '92', 'runs1': '71', 'six1': '0', 'dismissal1': 'run out (Hardik Pandya)', 'name1': 'Amla', 'fours1': '5'}, {'runs2': '32', 'balls2': '32', 'six2': '1', 'dismissal2': 'c Kohli    b Bumrah', 'name2': 'Markram(c)', 'fours2': '4'}, {'runs3': '1', 'balls3': '5', 'six3': '0', 'dismissal3': 'c Rohit    b Hardik Pandya', 'name3': 'Duminy', 'fours3': '0'}]

为了计算净运行率,建议不要使用列表理解-为了可读性。你可以使用for循环来计算NRR

final_scores = []
for i, x in enumerate(score):
    nrr = int(x.get('runs'))/float(x.get('balls')) * 100
    x.update({'NRR': round(nrr, 2)})
    y  = {k+str(i+1): v for k, v in x.items()}
    final_scores.append(y)

让我们看看这一点:

>>> final_scores = []
>>> for i, x in enumerate(score):
...     nrr = int(x.get('runs'))/float(x.get('balls')) * 100
...     x.update({'NRR': nrr})
...     y  = {k+str(i+1): v for k, v in x.items()}
...     final_scores.append(y)
... 
>>> final_scores
[{'balls1': '92', 'runs1': '71', 'six1': '0', 'dismissal1': 'run out (Hardik Pandya)', 'name1': 'Amla', 'fours1': '5', 'NRR1': 77.17}, {'runs2': '32', 'balls2': '32', 'six2': '1', 'dismissal2': 'c Kohli    b Bumrah', 'name2': 'Markram(c)', 'NRR2': 100.0, 'fours2': '4'}, {'runs3': '1', 'balls3': '5', 'six3': '0', 'dismissal3': 'c Rohit    b Hardik Pandya', 'name3': 'Duminy', 'fours3': '0', 'NRR3': 20.0}]

这能更简洁吗?可能吧-但我会把这个留给你。你知道吗

这是一种方法:

lst = [{'dismissal': 'run out (Hardik Pandya)', 'balls': '92', 'name': 'Amla', 'fours': '5', 'six': '0', 'runs': '71'}, 
       {'dismissal': 'c Kohli    b Bumrah', 'balls': '32', 'name': 'Markram(c)', 'fours': '4', 'six': '1', 'runs': '32'}, 
       {'dismissal': 'c Rohit    b Hardik Pandya', 'balls': '5', 'name': 'Duminy', 'fours': '0', 'six': '0', 'runs': '1'}]

# add identifiers and convert numeric data
lst = [{k+str(i): int(v) if v.isdigit() else v \
                  for k, v in d.items()} \
                  for i, d in enumerate(lst, 1)]

# add NRR
for d in lst:
    idx = list(d.keys())[0][-1]
    d['NRR'+idx] = d['runs'+idx] / d['balls'+idx] * 100

# [{'NRR1': 77.17391304347827,
#   'balls1': 92,
#   'dismissal1': 'run out (Hardik Pandya)',
#   'fours1': 5,
#   'name1': 'Amla',
#   'runs1': 71,
#   'six1': 0},
#  {'NRR2': 100.0,
#   'balls2': 32,
#   'dismissal2': 'c Kohli    b Bumrah',
#   'fours2': 4,
#   'name2': 'Markram(c)',
#   'runs2': 32,
#   'six2': 1},
#   ...

相关问题 更多 >

    热门问题