我试图用一个for循环遍历一个字典,按照一个值元素(批处理顺序号)的顺序显示键和值。
我可以以预期的格式打印键和值,但我不知道如何以正确的批处理顺序得到行。
我需要在不使用lambda或函数的情况下使用for循环和中的逻辑来完成这个任务。
print ('Rays starters' + "\n")
rays_starters = {
'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 player in rays_starters:
print (player + str(rays_starters[player]))
print ('\n' + 'Today\'s lineup' + '\n')
for player in rays_starters:
batting_order = rays_starters.get(player)
print('Batting ' + str(batting_order[1]) + ' : ' + str(batting_order[0]) + ' ' + player + ' ,current avg: ' + str(batting_order[2])) 输出应该如下所示:
Rays starters
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]
Today's lineup
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事实上,我的输出看起来就像这样,除了击球顺序不正常。请帮助我走上正确的轨道,记住我正在努力学习,所以欢迎任何有帮助的批评!
发布于 2015-06-01 20:23:36
这是一个有效的方法,因为我们知道将会有9名击球手。
lineup = [None] * 9
for player, stats in rays_starters.items():
lineup[stats[1]-1] = player, stats
print ('\nToday\'s lineup\n')
for player, batting_order in lineup:
print('Batting ' + str(batting_order[1]) + ' : ' + str(batting_order[0]) + ' ' + player + ' ,current avg: ' + str(batting_order[2]))我们所做的就是初始化一个包含9个元素的数组,并使用批处理顺序将播放器和统计数据映射为一个元组,并将其映射到正确的数组索引。然后循环遍历player和statistics元组的数组,并打印所需的格式化输出。这是O(n)。
这个概念基本上来自于基类,或者更具体地说,是计数排序的一个非常简单的例子,在这种情况下,所有的频率都是1,而“关键函数”只是从批处理顺序中减去1来获得数组索引。
正如@PadraicCunningham在注释中所指出的,理论上这可以通过使用len函数用于任意数量的击球手。
发布于 2015-06-01 20:05:10
字典没有订单,所以你不能对它们进行排序。但是,您可以迭代它的值以一种有序的方式。为此,您可以使用sorted()和一个键函数,该函数指定如何在传递(key, value)元组时获得值:
for player, batting in sorted(rays_starters.items(), key=lambda x: x[1][1]):
print('Batting {1} : {0} {player}, current avg: {2}'.format(*batting, player=player))对于您的rays_starters字典,这将产生以下结果:
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如果不能指定这样一个关键函数,则必须自己实现排序。为此,您可以首先将字典转换为列表,然后对其进行排序。为了不需要一个关键函数,您应该构造该列表,因此要对其进行排序的值是列表中的第一个:
data = []
for player, batting in rays_starters.items():
data.append((batting[1], player, batting[0], batting[2]))
# now sort the list
data.sort()
# and iterate and print
for player in data:
print('Batting {0} : {1} {2}, current avg: {3}'.format(*player))还可以使用列表理解创建data列表:
data = [(b[1], p, b[0], b[2]) for p, b in rays_starters.items()]发布于 2015-06-01 20:10:10
如果不能使用min、lambdas、排序和其他函数调用等,则手动查找从最低值开始的击球次数最低的球员:
out = []
cp = rays_starters.copy()
# keep going while the dict is not empty
while cp:
mn = float("inf")
it = None
# iterate over the item to find the min each time
# from remaining items
for k, v in cp.items():
if v[1] < mn:
mn = v[1]
it = (k, v)
# append current it k/v pair which has the lowest
# batting number
out.append(it)
# remove the key so we can get the next lowest
del cp[it[0]]
for k,v in out:
print("{} {}".format(k,v))输出:
Kiermaier ['CF', 1, 240]
Souza Jr ['RF', 2, 229]
Longoria ['3B', 3, 282]
Loney ['1B', 4, 222]
Forsythe ['2B', 5, 304]
DeJesus ['DH', 6, 299]
Cabrera ['SS', 7, 214]
Guyer ['LF', 8, 274]
Rivera ['C', 9, 194]或不抄袭:
out = []
seen = set()
# for every player in the dict
for _ in rays_starters):
mn = float("inf")
it = None
# again get min each time based on the batting number
for k, v in rays_starters.items():
# this time we make sure we have not already used
# the player
if v[1] < mn and k not in seen:
mn = v[1]
it = (k, v)
out.append(it)
# add the name of the player that matches our current min
seen.add(it[0])
for k,v in out:
print("{} {}".format(k,v))如果您实际上可以排序或使用排序,请使用批处理编号作为键,只需对项目进行排序:
temp = {v[1]:[k]+v for k, v in rays_starters.items()}
for k ,v in sorted(temp.items()):
print("{} {}".format(v[0], v[1:]))
Kiermaier ['CF', 1, 240]
Souza Jr ['RF', 2, 229]
Longoria ['3B', 3, 282]
Loney ['1B', 4, 222]
Forsythe ['2B', 5, 304]
DeJesus ['DH', 6, 299]
Cabrera ['SS', 7, 214]
Guyer ['LF', 8, 274]
Rivera ['C', 9, 194]如果击球总是在1点开始:
temp = {v[1]:[k]+v for k, v in rays_starters.items()}
for k in range(1,len(rays_starters)+1):
v = temp[k]
print("{} {}".format(v[0], list(v[1:])))您可以解压打印:
temp = {v[1]:[k]+v for k, v in rays_starters.items()}
for k in range(1,len(rays_starters)+1):
name, nm, btn, avg = temp[k]
print("Batting: {} {} {}, current avg: {}".format(btn, name, nm, avg))输出:
Batting: 1 Kiermaier CF, current avg: 240
Batting: 2 Souza Jr RF, current avg: 229
Batting: 3 Longoria 3B, current avg: 282
Batting: 4 Loney 1B, current avg: 222
Batting: 5 Forsythe 2B, current avg: 304
Batting: 6 DeJesus DH, current avg: 299
Batting: 7 Cabrera SS, current avg: 214
Batting: 8 Guyer LF, current avg: 274
Batting: 9 Rivera C, current avg: 194https://stackoverflow.com/questions/30582191
复制相似问题