快速修改大型词典值的方法

时间:2016-03-10 09:12:45

标签: python performance dictionary

我有一个大字典,每个值本身都是一个很大的列表。

我必须浏览每个值并删除不遵循此模式的成员:

“每个小于前一个成员的成员应该小于下一个成员,或者如果成员大于前一个成员,那么它也应该大于下一个成员。”

这就是我的尝试:

Nodes = {1:[2,...,3],..., 2:[3,...5]} # a short example of the big dict
for key in Nodes.keys():
    for i in range(1, len(Nodes[key])-1):
        if Nodes[key][i-1] < Nodes [key][i] < Nodes[key][i+1] or Nodes[key][i-1] > Nodes [key][i] > Nodes[key][i+1]:
            del Nodes[key][i]    

这就是我得到的:

Traceback (most recent call last):
if Nodes[key][i-1] < Nodes [key][i] < Nodes[key][i+1] or Nodes[key][i-1] > Nodes [key][i] > Nodes[key][i+1]:
IndexError: list index out of range

我可以预测的一件事是操作员立即删除列表成员然后列表混乱,因为当我试图通过打印列表成员而不是删除它来检查时,代码工作。

1 个答案:

答案 0 :(得分:0)

  

我可以预测的一件事是运营商删除了列表成员   然后,名单就会混乱,因为当我试图检查这个时   通过打印列表成员而不是删除它,代码可以正常工作。

你是对的。正如@Daniel所说,“不要修改你正在迭代的列表。”

您可以创建一个新列表,将所有有效值附加到新列表,并在该新列表的dict中指定键。

public class MyWindow extends Window{

private final Panel panel;
private final TextField textField;
private TextArea textArea;
private String value;

public MyWindow(String title){
     this.value = value;
     setHeading("Example");
     initComponents();
}

private void initComponents(){
    panel = new Panel(new Layout());
    textField = new TextField();
    textArea = new TextArea();
    textArea.setValue(value);
    textArea.setToolTip("tooltip");
    // initializing any components and settings of these components
}
}