Python字典对于光线棒球运动员

时间:2015-05-19 06:33:31

标签: python

第4步是我真正需要的答案。

  1. 为9张Tampa Bay Rays制作一本字典。使用播放器名称作为键和每个值的列表。 这就是我所拥有的:

    rays_players = { 'DeJesus': ['DH', 6, 299],
             'Loney': ['1B', 4, 222],
             'Rivera': ['C', 9, 194],
             'Forsythe': ['2B', 5, 304],
             'Souza Jr': ['RF', 2, 229],
             'Longoria': ['3B', 3, 282],
             'Cabrera': ['SS', 7, 214],
             'Kiermaier': ['CF', 1, 240],
             'Guyer': ['LF', 8, 274] }
    
  2. 每个值列表应保持玩家所扮演的位置,击球顺序和当前的击球平均值。 见上文

  3. 字典完成后,使用for循环显示字典键和值。这就是我得到的:这就是我所拥有的:

    for key in rays_players:
        print(key, rays_players[key])
    
  4. 接下来,使用循环打印"阵容" (按击球顺序的字典)。 如何订购?

    for key in sorted(rays_players.items(), key=lambda v: (v)):
        print ("%s: %s" % (key))
    

    这是否在正确的轨道上?

    第4步应该是这样的:

    Batting 1: CF Kiermaier, current avg: 240
    Batting 2: RF Souza Jr, current avg: 229
    Batting 3: 3B Longoria, current avg: 282
    Batting 4: 1B Loney, current avg: 222
    Batting 5: 2B Forsythe, current avg: 304
    Batting 6: DH DeJesus, current avg: 299
    Batting 7: SS Cabrera, current avg: 214
    Batting 8: LF Guyer, current avg: 274
    Batting 9: C Rivera, current avg: 194
    

1 个答案:

答案 0 :(得分:3)

部分您可能会因为采用不适当的数据格式而使问题变得更加困难(不要担心,初学者经常会这样做)。所以你可能想问自己字典是否是最合适的结构。

你在第3步的排序是正确的,但对于元素key,你要对击球顺序进行排序,即key[1][1](顺便说一句,这是一个糟糕的变量名选择因为你正在迭代字典的项目。)

您应该会发现这可用于排序和打印您的击球顺序:

print "Rays Starters"
for key in sorted(rays_players.items(), key=lambda v: (v[1][1])):
    print ("%s: %s" % (key))

但这并不会使排序键变得非常明显,所以您可能希望定义一个简单的类,它允许您按名称引用播放器属性,如下所示:

class Player():
    def __init__(self, name, position, order, average):
        self.name = name
        self.position = position
        self.order = order
        self.average = average

然后您可以将玩家保留在列表中,如下所示。

players = [Player('DeJesus', 'DH', 6, 299),
           Player('Loney', '1B', 4, 222),
           Player('Rivera', 'C', 9, 194),
           Player('Forsythe', '2B', 5, 304),
           Player('Souza Jr', 'RF', 2, 229),
           Player('Longoria', '3B', 3, 282),
           Player('Cabrera', 'SS', 7, 214),
           Player('Kiermaier', 'CF', 1, 240),
           Player('Guyer', 'LF', 8, 274)]

print "Rays Starters"
print "Rays Starters"
for p in sorted(players, key=lambda v: v.order):
    print ("Batting %s: %s %s, current average %s" % (p.order, p.position, p.name, p.average))

这不仅让您在击球顺序上更加明显,还可以让您根据需要选择各个属性。

进行格式化的另一种方法是使用较新的.format()字符串方法(它肯定被反向移植到2.7,但我不知道它是否在早期的Python 2版本中):

print "Rays Starters"
for p in sorted(players, key=lambda v: v.order):
    print ("Batting {0.order}: {0.position} {0.name}, current average {0.average}".format(p))

就更新正在运行的订单而言,我认为您需要按名称查找特定的玩家,而不是简单地知道他们出现在列表中的位置。

这是一个小辅助函数,它将为具有给定名称的玩家返回正确的列表索引:

def find_player(name):
    for n, player in enumerate(players):
        if player.name == name:
            return n

print "Longoria is element number", find_player('Longoria')

print语句应显示

Longoria is element number 5

然后您可以使用此方法以下列方式更改播放器列表:

players[find_player("Rivera")] = Player('Wilson', 'C', 9, 152)
players[find_player("DeJesus")] = Player('Beckham', 'DH', 6, 200)

print "Rays Starters"
for p in sorted(players, key=lambda v: v.order):
    print ("Batting {0.order}: {0.position} {0.name}, current average {0.average}".format(p))

给出输出

Rays Starters
Batting 1: CF Kiermaier, current average 240
Batting 2: RF Souza Jr, current average 229
Batting 3: 3B Longoria, current average 282
Batting 4: 1B Loney, current average 222
Batting 5: 2B Forsythe, current average 304
Batting 6: DH Beckham, current average 200
Batting 7: SS Cabrera, current average 214
Batting 8: LF Guyer, current average 274
Batting 9: C Wilson, current average 152