我试图计算包含词典的列表的净运行率。 假设列表是:
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'}
..........]
答案 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