2016-02-19 403 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:]]