是否可以迭代列表并跳过某些元素?

时间:2016-05-31 21:15:37

标签: python loops iteration

我导入了一个包含两列(名称,数量)的.xml。我想编写一个函数,将名称分组为数量等于50的组。例如给定:x - 10,y - 35,z - 42,n - 5,m - 3和p - 5.程序将返回" X,Y,N"和" z,m,p"。它不会返回" x,y,p"因为n首先出现。另外,在循环的第一次迭代之后,它没有使用z,m或p,但是会在第二次迭代时考虑它们,而忽略第一次迭代已经使用的名称。

对于这样一个小例子,我能用我有限的知识创建这个代码。但是,我需要将其应用于1000多个名称,为此,我的代码主要由while和if / else循环组成,效率太低。

再多一点信息: 代码基本上分为三个部分: (A)如果总和达到50 - >产量 (B)如果小于50,继续前进(A) (C)如果大于50,则忽略程序刚刚添加的数字并尝试列表中的下一个并测试条件(B),直到达到(A)。

我几乎可以找出(A)和(B),但我正在努力有效地执行(C)部分。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

由于您的目标是找到精确加起来为50的元组,因此解决方案将比您当前的方法复杂一些。 请考虑以下数字:

x  20
y  25
z  10
m  15
n   8
p  22

您的算法首先会添加x = 20和y = 25,然后遍历列表的其余部分,而不会找到完成此元组的匹配5。正确的解决方案是" x,n,p"和" y,z,m"。

一个工作算法将收集总和小于50的条目链,并在一个链达到50时停止一次遍历列表。链元素将从列表中删除,并重复该过程直到没有元组可以被发现。

Python承诺的代码:(请原谅,这是我的第一个python程序:-))

class ListElement:
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def __repr__(self):
        return self.name + "=" + self.value.__str__()

class ChainElement:
    def __init__(self, prev, listElement):
        self.prev = prev
        self.listElement = listElement
        if prev:
            self.value = listElement.value + prev.value
        else:
            self.value = listElement.value

    def __repr__(self):
        if self.prev:
            return self.prev.__repr__() + "," + self.listElement.__repr__()
        else:
            return self.listElement.__repr__()

    def removeAllFrom(self, list):
        list.remove(self.listElement)
        if self.prev:
            self.prev.removeAllFrom(list)

list = []
list.append(ListElement("x", 20))
list.append(ListElement("y", 25))
list.append(ListElement("z", 10))
list.append(ListElement("m", 15))
list.append(ListElement("n",  8))
list.append(ListElement("p", 22))

def find_chain():
    chains = [ChainElement(None, list[0])]

    for le in list[1:]:
        new_chains = []
        for ce in chains:
            new_chain = ChainElement(ce, le)
            if new_chain.value == 50:
                return new_chain
            elif new_chain.value < 50:
                new_chains.append(new_chain)
        chains.extend(new_chains);
    return None

while list:
    tuple = find_chain()
    if tuple:
        print "Found:", tuple
        tuple.removeAllFrom(list)
    else:
        print
        print "Residue:", list
        break

有一些值的组合,即使存在一个完整的解决方案,该程序也找不到完整的解决方案,理解和解决这个问题只是为读者留下了一个练习......