如何从包含字典的列表中计算出runrate?

时间:2018-02-14 03:02:33

标签: python python-3.x python-2.7

我试图计算包含词典的列表的净运行率。 假设列表是:

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'}
..........]

3 个答案:

答案 0 :(得分:0)

你几乎有一个班轮来更新字典。只需调整你的字典/列表理解如下:

def frontman

由于val为0索引,您可能需要添加dic= {k+str(i+1): v for i, x in enumerate(score, 1) for k, v in x.items()}

演示:

enumerate

要计算净运行速度,建议您不要使用列表推导 - 以提高可读性。你可以使用一个计算NRR的for循环

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'}]

这可以更简洁吗?可能 - 但我会把它留给你。

答案 1 :(得分: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},
#   ...

答案 2 :(得分:0)

还可以使用数据帧方法来清除代码来计算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