2 回答

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
此代碼將計(jì)算分?jǐn)?shù)。代碼相當(dāng)簡單。
不是遍歷輸入字典來計(jì)算每對的分?jǐn)?shù),而是將南北分?jǐn)?shù)存儲(chǔ)在collections.Counter實(shí)例中,該實(shí)例記錄了產(chǎn)生每個(gè)分?jǐn)?shù)的對數(shù)。這使得計(jì)算每一對的賽點(diǎn)得分變得更容易——我們只是將得分較低的數(shù)量加倍,并將得分相等的數(shù)量相加,減去一個(gè)以計(jì)算當(dāng)前伙伴關(guān)系的得分。
import collections
import itertools
def extract_rows(resp):
"""Extract the rows for the board from the query response."""
# Based on the data structure provided by the OP.
rows = [row["_source"] for row in resp["hits"]["hits"]]
# We want to return the group the data by board number
# so that we can score each board.
keyfunc = lambda row: int(row['board_number'])
rows.sort(key=keyfunc)
for _, group in itertools.groupby(rows, keyfunc):
yield list(group)
def compute_mp(scores, score):
"""Compute the match point score for a pair."""
mp_score = sum(v for k, v in scores.items() if score > k) * 2
# The pair's own score will always compare equal - remove it.
mp_score += sum(v for k, v in scores.items() if score == k) - 1
return mp_score
def score_board(tables):
"""Build the scores for each pair."""
scores = []
# Store the scores for each N-S partnership.
ns_scores = collections.Counter(int(table["nsscore"]) for table in tables)
# The top score is (2 * number of tables) - 2, then reduced by one for each
# equal top score.
top = 2 * (len(tables) - 1) - (ns_scores[max(ns_scores)] - 1)
# Build the output for each pair.
for table in tables:
output = {
"board": table["board_number"],
"nsp": table["nsp"],
"ewp": table["ewp"],
}
ns_score = int(table["nsscore"])
ns_mp_score = compute_mp(ns_scores, ns_score)
output["ns_mp_score"] = ns_mp_score
ew_mp_score = top - ns_mp_score
output["ew_mp_score"] = ew_mp_score
scores.append(output)
return scores
# Replace this function with one that adds the rows to
# the new search index
def report(scores):
"""Print the scores."""
for row in scores:
print(row)
運(yùn)行代碼:
rows = extract_rows(resp)
scores = [score for rows in extract_rows(resp) for score in score_board(rows)]
report(scores)
產(chǎn)生這個(gè)輸出:
{'board': '1', 'nsp': '4', 'ewp': '11', 'ns_mp_score': 6, 'ew_mp_score': 2}
{'board': '1', 'nsp': '5', 'ewp': '12', 'ns_mp_score': 2, 'ew_mp_score': 6}
{'board': '1', 'nsp': '1', 'ewp': '16', 'ns_mp_score': 4, 'ew_mp_score': 4}
{'board': '1', 'nsp': '6', 'ewp': '13', 'ns_mp_score': 8, 'ew_mp_score': 0}
{'board': '1', 'nsp': '7', 'ewp': '14', 'ns_mp_score': 0, 'ew_mp_score': 8}
{'board': '2', 'nsp': '3', 'ewp': '10', 'ns_mp_score': 4, 'ew_mp_score': 4}
{'board': '2', 'nsp': '7', 'ewp': '14', 'ns_mp_score': 4, 'ew_mp_score': 4}
{'board': '2', 'nsp': '8', 'ewp': '15', 'ns_mp_score': 0, 'ew_mp_score': 8}
{'board': '2', 'nsp': '1', 'ewp': '16', 'ns_mp_score': 8, 'ew_mp_score': 0}
{'board': '2', 'nsp': '2', 'ewp': '9', 'ns_mp_score': 4, 'ew_mp_score': 4}

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
這不是我的工作,它是“rvs”的工作,但由于這是我正在尋找的答案,因此我會(huì)將其發(fā)布在這里,以便對其他人有所幫助。
scores = {}
for row in arr["hits"]["hits"]:
nsp = row["_source"]["nsp"]
nsscore = row["_source"]["nsscore"]
scores[nsp] = nsscore
input_scores = {}
def calculate_score(pair, scores):
score = 0
for p in scores:
if p == pair:
continue
if scores[p] < scores[pair]:
score += 2 # win
elif scores[p] == scores[pair]:
score += 1
return score
board_num = arr["hits"]["total"]
top = (board_num - 1) * 2
result_score = {}
for row in arr["hits"]["hits"]:
nsp = row["_source"]["nsp"]
ewp = row["_source"]["ewp"]
res = calculate_score(nsp, scores)
ew_mp_score = top - res
result_score.update({'nsp':nsp, 'ns_mp_score': res, 'ewp': ewp, 'ew_mp_score': ew_mp_score})
print(result_score)
謝謝你。
添加回答
舉報(bào)