从不同的列表动态构建字典

时间:2013-11-14 08:58:41

标签: python list yield pop

Python问题。让我们说我会有各种各样的名单,像这样,

[1, 5, 3, 1, 9, 10, 1, 20]
[1, 5]
[1, 2, 3, 1, 7, 10, 1, 2, 8, 21]
[1, 5, 6, 4, 0, 16, 1, 5, 6, 4, 0, 16]

这些数字代表体育比赛的得分,其中第1组是列表的前半部分,第2组是列表的后半部分。列表前半部分的最后一个数字(Team 1得分)总是游戏总数。从列表的前半部分开始的倒数第二个数字始终是游戏加时得分。列表中的第一项是第一期的得分。列表中的第二项是第二期的分数。等等,例如,[1,5]意味着第1队的总得分为1,而第2队的总得分为5.另一个例子,[1,5,3,9,9,10,1, 20]意味着第一队1队得分1分,第二段得5分,加时赛3分,总积9分,第2队得分9分,第二段得10分,得1分在加时赛中,共计20分。

我想创建一个将这些数字从列表中粘贴到字典中的函数,如果列表中有值,它应该只填充字典键。

score['sec_away_team_1'], score['sec_away_team_2'], score['sec_away_team_3'], score['sec_away_team_4'], score['sec_away_team_ot'], score['sec_away_team_total'], 
score['sec_home_team_1'], score['sec_home_team_2'], score['sec_home_team_3'], score['sec_home_team_4'], score['sec_home_team_ot'], score['sec_home_team_total']

这样做的一种方法是使用很多if语句创建一个函数,如果我知道列表有多长,我可以针对如何解压缩列表做不同的场景,但是因为我将解压缩列表各种大小我认为制作如此多的if语句会很难看......如何通过一个通用函数来完成,该函数既可以从列表中生成项目,也可以使用它们并弹出它们,或者其他方式?

1 个答案:

答案 0 :(得分:2)

此功能可以满足您的需求:

def scores_to_dict(scores):
    d = {}
    team_1 = ('team_1', scores[:len(scores)/2])
    team_2 = ('team_2', scores[len(scores)/2:])
    teams = [team_1, team_2]
    for team, scores in teams:
        for idx, score in enumerate(reversed(scores)):
            if idx == 0:
                d['%s_total' % team] = score
            elif idx == 1:
                d['%s_overtime' % team] = score
            else:
                d['%s_round_%s' % (team, len(scores)-idx)] = score
    return d

测试它:

scores = [[1, 5, 3, 1, 9, 10, 1, 20],
          [1,5],
          [1, 2, 3, 1, 7, 10, 1, 2, 8, 21],
          [1, 5, 6, 4, 0, 16, 1, 5, 6, 4, 0, 16]]

from pprint import pprint
for score in scores:
    print score
    pprint(scores_to_dict(score))
    print '--'

输出:

>>> 
[1, 5, 3, 1, 9, 10, 1, 20]
{'team_1_overtime': 3,
 'team_1_round_1': 1,
 'team_1_round_2': 5,
 'team_1_total': 1,
 'team_2_overtime': 1,
 'team_2_round_1': 9,
 'team_2_round_2': 10,
 'team_2_total': 20}
--
[1, 5]
{'team_1_total': 1, 'team_2_total': 5}
--
[1, 2, 3, 1, 7, 10, 1, 2, 8, 21]
{'team_1_overtime': 1,
 'team_1_round_1': 1,
 'team_1_round_2': 2,
 'team_1_round_3': 3,
 'team_1_total': 7,
 'team_2_overtime': 8,
 'team_2_round_1': 10,
 'team_2_round_2': 1,
 'team_2_round_3': 2,
 'team_2_total': 21}
--
[1, 5, 6, 4, 0, 16, 1, 5, 6, 4, 0, 16]
{'team_1_overtime': 0,
 'team_1_round_1': 1,
 'team_1_round_2': 5,
 'team_1_round_3': 6,
 'team_1_round_4': 4,
 'team_1_total': 16,
 'team_2_overtime': 0,
 'team_2_round_1': 1,
 'team_2_round_2': 5,
 'team_2_round_3': 6,
 'team_2_round_4': 4,
 'team_2_total': 16}
--