第4步是我真正需要的答案。
为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] }
每个值列表应保持玩家所扮演的位置,击球顺序和当前的击球平均值。 见上文。
字典完成后,使用for循环显示字典键和值。这就是我得到的:这就是我所拥有的:
for key in rays_players:
print(key, rays_players[key])
接下来,使用循环打印"阵容" (按击球顺序的字典)。 如何订购?
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
答案 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