2016-02-19 404 views
0

因此,我的程序要求用戶輸入一個字符串列表,然後對字符串進行分類,如果第一個字母在同一個字符串中再次重複,則將其存儲到另一個列表。這是我到目前爲止。索引列表查找字符串中的重複字符(Python)

iput = [] 
i = 0 
final = [] 

while i < 1: 
    iput += [input('Enter words here: ')] 
    if not iput[-1]: 
     i += 1 

i = 0 
z = 1 
while i < len(iput) - 1: 
    print(i) 
    while iput[i][0] != iput[i][z]: 
     if z == len(iput[i]): 
      break 
     z += 1 

    i += 1 

print(final) 
print(iput) 

我不斷收到一個「字符串索引超出範圍」錯誤,不能想辦法補充說,已經要求上述的字符串。有什麼建議麼?

+1

能否請您具體談談您的問題?我真的不明白它是什麼? – Arman

+0

該程序提示用戶輸入單詞列表,並且只將其第一個字母再次出現在單詞其他地方的那些單詞(例如,「狒狒」)存儲在列表中。一旦用戶輸入空字符串,程序應打印存儲在列表中的元素,每行一個字。 – bulletss

回答

0

您的z將增長到長於iput的值。

z達到iput的長度時,您會打破內循環,但不會在外循環中將其重置。

0

您的代碼將首先訪問超出界限的索引,然後檢查索引是否超出界限。在您進入超出界限之前進行檢查。結束後

z = 1

while循環:

while i < len(iput) - 1: 
    print(i) 
    while z != len(iput[i]) and iput[i][0] != iput[i][z]: 
     z += 1 

    i += 1 
1

因爲你應與所有elemtns檢查每一個列表元素,你應該重新z每while循環,所以加

while i < len(iput) - 1: 
    print(i) 
    while iput[i][0] != iput[i][z]: 
     if z == len(iput[i]): 
      break 
     z += 1 
    z = 1 
    i += 1 
0

這是關於z成爲一個太大:你不斷增加它在一個循環,但訪問前iput[i][z]您檢查z是否等於iput[i]。但是,如果它相同,則爲時已晚:Python字符串索引是基於0的,這意味着您的z最多可能變爲len(iput[i]) - 1

雖然這是對你的代碼中實際發生的事情的分析,但讓我說這個代碼是相當寬鬆的,因爲它闡明瞭很多機械細節,爲這種錯誤提供了機會。 Python中有語言結構可以讓你更簡潔地表達相同的事物(並且更高效)。

iput = [] 
final = [] 

while True: 
    iput += [input('Enter words here: ')] 
    if not iput[-1]: 
     break 

for i, line in enumerate(iput): 
    print(i) 
    for c in line[1:]: 
     if c == line[0]: 
      final.append(line) 
      break 

print(final) 
print(iput) 

甚至更​​Python,但你的算法少讓人聯想到:

final = [line for line in iput if line[0] in line[1:]]