2017-09-06 62 views
3

我有以下代碼需要一個字符串biology_score和分裂後,將其轉換爲一個字符串('b')。所需的輸出是生產什麼我都低於手動構建(用戶列表以及它們相應的分數)如何在Python中的列表上編寫索引循環?

我有興趣的最有效的方式來構建一個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. 最優雅的解決方案(for循環通過列表循環產生以上)

  2. 最簡單/使用le將字符串轉換爲字典的最快方法步驟AST號碼,然後實現相同的輸出(用戶:得分)

+0

你的第二個問題是在這裏回答:https://stackoverflow.com/questions/4576115/convert-a-list-to-a-dictionary-in-python – Tomalak

回答

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

對不起,忽略以前的評論 - 這是美麗的。工作正常。謝謝! – MissComputing

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去,訂單可能不會被保留。

1

其中一個方案是使用字典

如果iterables是不均勻的長度,缺失值填充與fillvalue

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

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

可以請你清楚的解釋一下d = dict(itertools.zip_longest(* [iter(biology_score.split(「,」))] * 2,謝謝! – MissComputing

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如果項目的原始順序應該preserverd。

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])) 
0

一個Python化的方式來獲得期望的結果是使用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}