繁体   English   中英

是否可以遍历列表并跳过某些元素?

[英]Is it possible to iterate over a list and skip certain elements?

我导入了一个包含两列(名称、数量)的 .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)。

在此先感谢您的帮助!

由于您的目标是找到恰好加起来为 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

有些值的组合即使存在,该程序也无法找到完整的解决方案,理解和解决这个问题留给读者作为练习......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM