【问题标题】:Lists, conditionals and loops don't give the result expected [closed]列表、条件和循环没有给出预期的结果[关闭]
【发布时间】:2014-09-24 20:27:42
【问题描述】:

我很确定它一定是愚蠢的,但是已经好几个小时没有弄明白为什么它不起作用,现在我必须知道。

我知道如何以另一种方式获得结果,但我想了解为什么这种方式不起作用的机制。

word="patata"
indeces=[]

for letter in word:
    i = word.find(letter)
    if i in indeces:
        start = indeces.index(i)
        index=word.find(letter,start)
        indeces.append(index)
    else:
       indeces.append(i)


print indeces

问题是我想要列表indeces 以及每个字母的索引,但即使字母相同也不能重复。

【问题讨论】:

  • 那么您的预期输出是什么,您会得到哪个输出?
  • 我不明白你想在这里做什么。您的代码给出了[0, 1, 2, 1, 2, 1] - 期望什么?您是否尝试使用this 之类的方法来获取[4, 1, 5, 2, 6, 3]
  • 你只想要所有字母的索引吗?
  • indeces = range(len(word)) 怎么样?如果那是你想要的。
  • 这看起来像是一个经典的 XY 问题。你到底想做什么?为什么你认为你想要所有字母的索引?

标签: python indexing


【解决方案1】:

这一行:

i = word.find(letter)

总是在word 中找到letter 的第一个匹配项,并且这一行:

start = indeces.index(i)

总是在indeces 中找到i 的第一个匹配项。然后,这一行:

index=word.find(letter,start)

包括 start,所以直接找到相同的字母!

使您当前的代码工作的唯一方法是引入一个while 循环,并在最后一次出现之后开始:

for letter in word:
    i = word.find(letter)
    while i in indeces:
        i = word.find(letter, i+1)
    indeces.append(i)

这会一直查找,直到找到当前letter 的新i。如果i 开始时不在indeces 中,则循环永远不会运行。


话虽如此,这是一种非常低效的方法;如果你想要索引使用range:

>>> range(len("patata"))
[0, 1, 2, 3, 4, 5]

如果您想要字母及其索引,请使用enumerate:

>>> list(enumerate("patata"))
[(0, 'p'), (1, 'a'), (2, 't'), (3, 'a'), (4, 't'), (5, 'a')]

【讨论】:

  • 非常感谢!!所有这些解释都非常有用。我上个月刚开始编程,自学可能很困难。
猜你喜欢
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2021-10-13
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多