2017-07-27 119 views
0

我想在迭代名单从我的列表中删除的元素进行迭代。我不认为复制清单并在任何一个上执行操作都能解决我的问题。 我尽快有一个嵌套列表, 在这里我得到的最左边或列表的最右边的值==最大I追加到一个新的列表LST1和从环原始列表其他休息流行的元素。删除列表,而在蟒蛇不复制到新的列表

lst= [[4, 3, 2, 1, 3, 5]] 
lst1=[] 
for i in range(len(lst)): 
     if lst[0][i]==max(lst[0]): 
      lst1.append(lst[0][i]) 
      lst.remove(lst[0][i]) 
     elif lst[0][maxsize_lst-1]==max(lst[0]): 
      lst1.append(lst[0][maxsize_lst-1]) 
      lst.remove(lst[0][maxsize_lst-1]) 
     else : 
      print("NO") 
      break; 

,我发现了以下错误,有时我得到索引超出范围大概是因为我删除元素,并再次遍历列表

ValueError: list.remove(x): x not in list 

列表1的输出结果应该像:

5 4 3 3 2 1 

编辑 最终的名单按降序来,但它不是一个亲排序blem。在这里,我将首先选择最左边或最右边的元素,并检查它是否为== max(lst)。如果它们中的任何一个都符合我的要求,那么我将删除该元素。现在,我的列表中会少一个元素。如果它是最左面流行的话,我会从指数1恢复到过去的,反之,如果它是最右边的我会再次这样做从索引0相同的搜索,以最大范围-2做同样的搜索。如果没有像如下左边或最右边!= MAX(LST)再破并打印无

+1

而不是删除,你为什么不保留你想要的新列表? – idjaw

+2

你可以使用'在LST项目:在范围内的''而不是为我(LEN(LST)):'这不是帮你这么多 – PRMoureu

+1

没有'list.remove(X):'在你的代码。发布实际的代码。 – TemporalWolf

回答

0

@ PRMoureu的评论是一个大提示有关错误的答案。

在您的样本数据,您的列表的大小为6,你遍历指数的,所以从0到5当你通过你的循环进步,你从你的列表中删除的东西,但你继续看为了它。所以在某些时候,你看着lst [0] [i]我不再存在,这就是为什么你会得到你的错误。只要您使用索引,就会发生这种情况。

但是你不需要索引到列表中。你需要它的价值。所以这个建议是一个非常好的主意:只需在列表本身而不是其索引上进行迭代。这会给你这样的代码:

lst= [[4, 3, 2, 1, 3, 5]] 
lst1=[] 
for val in lst[0]: 
    print(val) 
    if val == max(lst[0]): 
     print("a") 
     lst1.append(val) 
     lst[0].remove(val) 
     print(lst[0]) 
    # this shouldn't even be necessary; you should be able to sort just as well without it 
    elif lst[0][-1]==max(lst[0]): 
     print("b") 
     lst1.append(lst[0][-1]) 
     lst[0].remove(lst[0][-1]) 
    else : 
     print("NO") 
     break; 

注意,蟒蛇不会用结构像maxsize_lst。相反,它只会使用lst [0] [ - 1]来获取最后一个元素。我修复了你指的lst而不是lst[0]的几个地方,并且通过在值之间加上逗号使得你的lst定义实际上是有效的。

当我运行这段代码时,我得到了“NO”。留下印刷声明以了解原因。第一次,你有一个4.它不是最大值,所以你看看最后一个值是否是最大值。它是,所以它被添加。第二次,你有三个,这再次不是你的最大值。也不是最后的剩余价值(其他3),所以它说“不”,并放弃。您已经通过使用break声明了解了这个想法,但是您需要另一个循环来继续,直到列表为空。

为了得到这个工作,你需要类似如下的外循环:

lst= [[4, 3, 2, 1, 3, 5]] 
lst1=[] 
reset = True 
while len(lst[0]) != 0 and reset: 
    print(lst[0], lst1) 
    reset = False 
    for val in lst[0]: 
     print(val) 
     if val == max(lst[0]): 
      print("a") 
      lst1.append(val) 
      lst[0].remove(val) 
      reset = True 
      break 
     elif lst[0][-1]==max(lst[0]): 
      print("b") 
      lst1.append(lst[0][-1]) 
      lst[0].remove(lst[0][-1]) 
      reset = True 
      break 
     else : 
      print("NO") 
      break 

注意从左侧突然出现的时候,我确实需要甚至可以添加一个突破。不这样做,最终的结果是lst1过的[5, 4, 3, 3, 2]值,并且lst[0]仍然有它[1]

+0

(另外请注意,与你问题中的代码不同,你可以复制并粘贴到python解释器中,并得到完全描述的结果。这是任何好问题**或**答案的一部分。) –

1

它看起来像你排序第一个列表。这可以更容易地实现。排序后的函数会自动从最小到最大排序,然后您可以使用反转函数来排序最大到最小。尝试:

lst1 = reversed(sorted(lst[0])) 

编辑:如果你需要使用提出在原代码的方法,我在你的for循环抓住了一个错误。您正在LST的长度,而不是子表,代码应该是以下几点:

for i in range(len(lst[0])): 

另外,我不知道,如果你建立了一个变量maxsize_list,但你可以得到列表的最后一个元素很容易与lst [0] [ - 1]。最后,你的错误是由你试图从lst,而不是lst [0]去除lst [0] [ - 1]造成的。这是你的代码,没有语法错误。我相信当最大值出现时会出现一个语义错误。

lst= [[4,3,2,1,3,5]] 
lst1=[] 
for i in range(len(lst[0])): 
    if lst[0][i]==max(lst[0]): 
     lst1.append(lst[0][i]) 
     lst[0].remove(lst[0][i]) 
    elif lst[0][-1]==max(lst[0]): 
     lst1.append(lst[0][-1]) 
     lst[0].remove(lst[0][-1]) 
    else : 
     print("NO") 
     break; 
+0

'lst'是一个嵌套列表 – yinnonsanders

+0

感谢您的支持,现在的代码是正确的。 – mjmccolgan

+0

伙计们,我知道最终名单是按降序排列,但这不是排序问题。在这里,我将首先选择最左边或最右边的元素,并检查它是否为== max(lst)。如果它们中的任何一个都符合我的要求,那么我将删除该元素。现在,我的列表中会少一个元素。如果它是最左面流行的话,我会从指数1恢复到过去的,反之,如果它是最右边的我会再次这样做从索引0相同的搜索,以最大范围-2做同样的搜索。如果什么都没有,像最左边或最右边!=最大(第一)然后打破和打印否 – codaholic

4

有一个更简单的解决方案:

lst = [[4, 3, 2, 1, 3, 5]] 
print(sorted(lst[0], reverse=True)) 

结果:

[5, 4, 3, 3, 2, 1] 
+0

这就是为什么我爱蟒蛇。 – AK47

+0

伙计们,我知道最终名单是按降序排列的,但它不是排序问题。在这里,我将首先选择最左边或最右边的元素,并检查它是否为== max(lst)。如果它们中的任何一个都符合我的要求,那么我将删除该元素。现在,我的列表中会少一个元素。如果它是最左面流行的话,我会从指数1恢复到过去的,反之,如果它是最右边的我会再次这样做从索引0相同的搜索,以最大范围-2做同样的搜索。如果什么都没有像最左边或最右边那样!= Max(lst)然后打破并打印否 – codaholic

1

首先,你要在那里他们的级别从嵌套列表中删除值:在lstlst.remove(x)唯一的搜索,而不是在lst和嵌套在lst所有可能的列表。这将通过ValueError解决您的问题。其次,手动运行你的例子告诉你为什么它不工作:你永远不会更新maxsize_lst,因此只要你弹出一个项目,这个值不再有效。一个简单的解决方案是使用python的负向索引系统来访问列表的最后一个值:lst[-1]。但即便如此,如果你的目标是让您的列表排序的所有值,你的代码不能做到这一点:在你的例子已经是第一步,

  1. 其中i = 0,你从列表中删除5(最后一项,最大值)
  2. 下一步,我= 1,你将永远不会再次访问i = 0处的值但是那么这对你来说可能不是问题,目前还不清楚你想实现什么与您的代码...

编辑:我重读你的问题,如果你想要的东西实际上是弹出左/右值磨片ñ它是从旧列表新列表中的最大值,那么你不应该遍历列表与for循环,而是使用while循环这样的:

size_lst = len(lst[0]) 
while size_lst > 0: 
    if lst[0][0] == max(lst[0]): 
     # Leftmost element max of the list 
     lst1.append(lst[0].pop(0) # Pop leftmost element of lst[0] into lst1 
     size_lst -= 1 # Record that you decreased the size of your list 
    elif lst[0][-1] == max(lst[0]): 
     # Same with the rightmost element 
     lst1.append(lst[0].pop(-1) 
     size_lst -= 1 
    else: 
     break 
+0

我写了同样的内容。虽然我们都没有处理这个问题,即当它被打破时,我们并没有完全排序。 –

+0

@ScottMermelstein我不确定这是否是一项要求,作者在其他评论中明确指出,这不是一个排序问题。起初我确实感到困惑,但我确信有一个很好的理由来完成这个确切的任务! –