我有以下代码,它接受一个字符串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
必填答案
最优雅的解决方案(通过遍历列表来循环生成上述内容)
使用最少的步骤将字符串转换为字典的最简单/最快的方法,然后实现相同的输出(用户:得分)
答案 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}