【问题标题】:Is it possible to iterate over a list and skip certain elements?是否可以遍历列表并跳过某些元素?
【发布时间】:2016-05-31 21:15:37
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

  • 如果您展示您目前开发的代码,作为一个最低限度的完整工作示例,会更容易提供帮助。

标签: python loops iteration


【解决方案1】:

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

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

【讨论】:

  • 哦,我明白了,因为我一直在使用硬代码来查看它是否可以工作,所以我没有考虑过。你有什么建议可以帮助我开始你建议的解决方案吗?我是 Python 的新手,感觉有点过头了。非常感谢。
  • 我自己是 python 新手,所以我也必须在这个例子上做很多工作。我可以用伪代码(或 Smalltalk)写下算法,但你必须从中编写工作 python 代码......
  • 当然!伪代码会很棒,我想我可以从那里管理。提前谢谢!
  • 明天 - 它将是 python,所以我有学习它的动力:-)
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多