如何在Python中的列表上编写索引循环?

时间:2017-09-06 07:53:51

标签: python list for-loop

我有以下代码,它接受一个字符串biology_score并在分割后将其转换为字符串(' b')。所需的输出是生成我在下面手动构建的内容(具有相应分数的用户列表)

我会对构建for循环以实现此目的的最有效方法感兴趣。注意:我知道解决这个问题的最好方法是使用字典,但是这些目的我想使用一个列表。

代码:

biology_score="user1,30,user2,60,user3,99"
print(biology_score[1]) #for testing purposes
b=biology_score.split(",")
print(b) #prints lists
print(b[2]) #prints element in index 2 in the list

#desired output
print(b[0],"scored",b[1])
print(b[2],"scored",b[3])
print(b[4],"scored",b[5])

#create a for loop to do the above

必填答案

  1. 最优雅的解决方案(通过遍历列表来循环生成上述内容)

  2. 使用最少的步骤将字符串转换为字典的最简单/最快的方法,然后实现相同的输出(用户:得分)

6 个答案:

答案 0 :(得分:3)

我不确定这是否是你要找的:

biology_score="user1,30,user2,60,user3,99"
print(biology_score[1]) #for testing purposes
b=biology_score.split(",")
biology_dict = {}

for i in range(0, len(b), 2):  #looks only at even indices
    print(b[i],"scored",b[i+1])
    biology_dict[b[i]] = b[i+1]

答案 1 :(得分:1)

如果这是你需要的。

#create a for loop to do the above
for i in range(0,len(b)-1,2):
  print(b[i],"scored",b[i+1])

注意:Python版本< 3.6不支持元素顺序。因此,当您使用dict时,订单可能无法保留。

答案 2 :(得分:1)

其中一个选项是使用字典

如果迭代的长度不均匀,则使用fillvalue填充缺失值

import itertools    
d = dict(itertools.zip_longest(*[iter(biology_score.split(","))] * 2, 
fillvalue=""))

for k, v in d.items():
    print(k,'scored', v)

答案 3 :(得分:0)

您可以使用itertools模块中的grouper配方:

import itertools
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

然后:

for user, score in grouper(b, 2):
    print(user, 'scored', score)

制作字典:

dictionary = dict(grouper(b, 2))
for user, score in dictionary.items():
    print(user, 'scored', score)

如果要保留项目的原始顺序,请使用OrderedDict。

答案 4 :(得分:0)

主要是改写@ chngzm的答案,而且它可能不适合你的教学目的,但使用发电机非常好:

def user_scores(scores):
  s = scores.split(",")
  for idx in range(0, len(s), 2):
    yield s[idx], s[idx+1]

biology_score="user1,30,user2,60,user3,99"

for user, score in user_scores(biology_score):
  print("{0} scored {1}".format(user, score))

biology_dict = dict(s for s in user_scores(biology_score))
for user in biology_dict:
  print("{0} scored {1}".format(user, biology_dict[user]))

答案 5 :(得分:0)

获得所需结果的一种Pythonic方法是使用zip

biology_score = "user1,30,user2,60,user3,99"
values = biology_score.split(',')
print(dict(zip(values[::2], values[1::2])))
# {'user2': '60', 'user3': '99', 'user1': '30'}

如果您想要整数分数,可以使用map

print(dict(zip(values[::2], map(int, values[1::2]))))
# {'user2': 60, 'user3': 99, 'user1': 30}