【问题标题】:Comparison, exclusion, and popping elements from a list (Python)比较、排除和弹出列表中的元素 (Python)
【发布时间】:2018-01-23 07:00:49
【问题描述】:

我想将一个数字(dist)与排序列表(我的列表)的每个元素进行比较。

如果数字小于 myList 中的第一个元素,则我必须继续并为 dist 找到正确的位置,消除 myList 中的第一个元素并移动列表。

我现在的主要问题是当 dist 小于 myList 中的第一个元素时。索引超出范围...

dist = 10
mylist = [40, 30, 20, 15] # this is a sorted list

for j in range(0, len(mylist)):
    if mylist[j] < dist &  dist> mylist[j+1]:
        print (mylist[j], '<' ,dist, '>', mylist[j+1])
        #drop 40
        #shift the list so that is becomes: [30,20, 15,10]

【问题讨论】:

  • 使用and 而不是&amp;
  • @ChristianDean 有趣的是它仍然有效,因为按位优先它变成了mylist[j] &lt; dist &gt; mylist[j+1],它仍然是一样的。谈运气...
  • dist&gt; mylist[j+1] 这是导致问题的原因,因为在 for 循环的最后一次迭代中,j 将超过列表中的最大索引,您将收到错误
  • @cᴏʟᴅsᴘᴇᴇᴅ 嗯……你说得对。多么巧合。
  • @KGS and 运算符在继续处理其余条件(如果有)之前评估第一个条件,他的方法是正确的,除了使用@Dean 提到的正确操作数。

标签: python list replace indexoutofboundsexception


【解决方案1】:

IIUC,你想在它的正确位置插入dist并敲掉第一个元素。这很好,但你有一些问题。主要是你的情况,我不是在谈论&amp;。您需要确保dist 大于当前值,但小于下一个值。你这样做:

if mylist[j] < dist < mylist[j+1]:

您还必须运行到比len(mylist) 小一,以避免索引超出范围。

您可以使用的另一个技巧是for...else,它适用于dist 没有插入其他任何地方的极端情况。

简而言之,试试这个:

for j in range(len(mylist) - 1):
    if mylist[j] < dist < mylist[j + 1]:
         mylist.insert(j, dist)
         mylist = mylist[1:]
         break
else:
    mylist.append(dist)
    mylist = mylist[1:]

或者,您可以从 1 运行到 len(mylist),然后比较检查 mylist[j - 1] &lt; dist &lt; mylist[j]

【讨论】:

  • 非常感谢您的解释。它对我帮助很大。
猜你喜欢
  • 1970-01-01
  • 2015-06-11
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 2015-08-01
  • 2014-01-07
相关资源
最近更新 更多