2017-06-21 46 views
0

這裏有很多類似的帖子,但我找不到與我正在處理的問題直接匹配或導致解決方案的內容。Python 3.x:使用第二個重複索引的索引

我想使用包含在列表中的重複索引的第二個實例作爲另一個列表的索引。執行該功能時,我需要在用戶代碼之後從列表開頭到第一個星號的所有數字爲print,第一個星號和第二個星號之間的所有數字在通行碼後打印,然後是第二個後面的所有數字星號直到列表結束後才能打印PIN碼。數字的示例數據將是"['1', '2', '3', '4', '5', '*', '6', '*', '7', '8', '9', '10', '1']"。用戶代碼,密碼和密碼的元素數量可以改變,這就是爲什麼我試圖讓它在星號周圍打印。

換句話說,我想要下面的代碼到print,假設這些數字存在,User Code: 12345, Pass Code: 6, Pin Code: 789101,都在一行中。我不想要星號print

print_string += 'Elapsed Time: ' + str(time) + ', ' + 'User Code: {} '.format(''.join(str(dig) for dig in digit[:digit.index('*')])) + \ 
         'Pass Code: {} '.format(''.join(str(dig) for dig in digit[digit.index('*'):digit.index('*')])) + \ 
         'Pin Code: {} '.format(''.join(str(dig) for dig in digit[digit.index('*'):])) 
print(print_string) 

我只是無法弄清楚如何使它看起來順序星號。如果有更簡單的方法來執行此操作,請讓我知道!

感謝

+1

['str.split'](https://docs.python.org/2/library/stdtypes.html#str.split)? – spectras

+0

僅供參考我是Python的新手。 @spectras不完全確定str.split在這種情況下如何工作。糾正我,如果我錯了,但不str.split用於操縱字符串如何存儲,在這種情況下,在列表中?如果這可以使用,我不知道如何使用它。本質上,我想稱第一個星號作爲Code1的正確索引,第一個星號作爲左側索引,第二個星號作爲Code2的右側索引,第二個星號作爲Code3的左側索引。 – DRauch

回答

0

您應該能夠使用splitenumerate結合起來。

split將把值變成一個列表,並且您可以使用 enumerate來獲取當前代碼的索引,同時仍然獲得該值。

code = '1234*5678*9101' 
for i,val in enumerate(code.split('*')): 
    if i < len(lst)-1: 
     val += "*" 
    print ("Code {}: {}".format(i, val)) 

,如果你想這一切在同一行,使'打印這個樣子的你也可以使用打印的end參數:

print ("Code {}: {},".format(i, val), end='') 

結果:

Code 1: 1234* 
Code 2: 5678* 
Code 3: 9101 
Code 1: 1234*, Code 2: 5678*, Code 3: 9101, 

編輯:用新的帖子信息更新

可選打印帶有標題:

codeIn = ['1', '2', '3', '4', '5', '*', '6', '*', '7', '8', '9', '10', '1'] 

codeVals = ("".join(codeIn)).split("*") 

titles = ["User Code", "Pass Code", "Pin Code"] 
for title, val in zip(titles, codeVals): 
    print ("{}: {}".format(title, val)) 

輸出:在星號(分離)

User Code: 12345 
Pass Code: 6 
Pin Code: 789101 
+0

我該做什麼如果我不想打印「代碼1」和「代碼2」和「代碼3」作爲輸出?我不希望它按順序編號「Code {}:」,而是希望它在一行中打印「用戶代碼:」,「密碼:」和「引腳代碼:」。 @bloominonion – DRauch

+0

您可以使用標題創建另一個列表。請參閱編輯。 – bloominonion

+0

謝謝你的幫助! – DRauch

0

斯普利特得到各個琴絃。 當您打印時,將其附加到除最後一個項目之外的所有項目。

in_str = '1234*5678*9101' 
sep = '*' 
code_list = in_str.split(sep) 

for seq, item in enumerate(code_list): 
    term = '*' if seq < len(code_list)-1 else '' 
    print "Code" + str(seq) + ':', item + term 

輸出:

Code0: 1234* 
Code1: 5678* 
Code2: 9101 
+0

大多數情況下,問題中的星號不是要求,而是OP如何考慮問題的副作用。 @drauch>可以,如果提取的代碼不包含無關的星號?這會使代碼變得更簡單,因爲這個答案實際上是在拆分代碼後手動添加它們。 – spectras

+0

@spectras,星號不是必需的。提取的代碼不需要包含星號,只需包含兩者之間的值即可。 – DRauch

+0

@Prune我忘記提及數字輸入,或者你的情況in_str,實際上是一個列表。因此,輸入看起來像「['1','2','3','4','5','\','6','*','7','8',' 9','10','11']「,這會導致您的代碼產生:'屬性錯誤:'列表'對象沒有屬性'split'' – DRauch