【问题标题】:Indexing list to find duplicate characters in string (Python)索引列表以查找字符串中的重复字符(Python)
【发布时间】:2016-06-01 15:25:33
【问题描述】:

所以我的程序要求用户输入一个字符串列表,然后对字符串进行排序,如果第一个字母在同一个字符串中再次重复,它将把它存储到另一个列表中。这是我目前所拥有的。

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)

我不断收到“字符串索引超出范围”错误,并且想不出添加具有上述要求的字符串的方法。有什么建议吗?

【问题讨论】:

  • 您能更具体地谈谈您的问题吗?我真的不明白它是什么?
  • 程序提示用户输入单词列表,并在列表中仅存储第一个字母再次出现在单词其他地方的单词(例如,“Baboon”)。一旦用户输入一个空字符串,程序应该打印存储在列表中的元素,每行一个字。

标签: python string list python-3.x indexing


【解决方案1】:

您的z 的值将增长到超过iput 的长度。

z 达到iput 的长度时,您会中断内部循环,但永远不会在外部循环中重置它。

【讨论】:

    【解决方案2】:

    您的代码将首先访问越界索引,然后检查索引是否越界。在访问越界索引之前进行检查。

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

    【讨论】:

      【解决方案3】:

      因为您应该使用所有元素检查每个列表元素,所以您应该在每个 while 循环中重置 z 所以添加:

      z = 1

      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
      

      【讨论】:

        【解决方案4】:

        这是关于z 变得太大:您不断地在循环中递增它,但在检查z 是否等于iput[i] 之前访问iput[i][z]。但是一旦相等,就为时已晚: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)
        

        更加 Pythonic,但不太像您的算法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-02
          • 1970-01-01
          • 2019-11-17
          • 2013-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-29
          相关资源
          最近更新 更多