Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以迭代列表并跳过某些元素?_Python_Loops_Iteration - Fatal编程技术网

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

Python 是否可以迭代列表并跳过某些元素?,python,loops,iteration,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,而是在第二次迭代时考虑它们,而忽略第一次迭代已经使用的名称。p> 对于这样一个小例子,我能够用有限的知识创建此代码。但是,我需要将此应用于1000多个名称,对于这一点,我的代码(主要由while和if/else循环

我导入了一个包含两列(名称、数量)的.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,而是在第二次迭代时考虑它们,而忽略第一次迭代已经使用的名称。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程序:-)

类列表元素:
定义初始化(自身、名称、值):
self.name=名称
自我价值=价值
定义报告(自我):
返回self.name+“=”+self.value.\uuu str\uuuu()
类元素:
定义初始化(self、prev、listElement):
self.prev=prev
self.liselement=liselement
如果上一个:
self.value=liselement.value+prev.value
其他:
self.value=liselement.value
定义报告(自我):
如果self.prev:
返回self.prev._repr__()+“,“+self.listElement._repr__())
其他:
返回self.listElement.\uu repr\uuuu()
def removeAllFrom(自我,列表):
list.remove(self.liselement)
如果self.prev:
self.prev.removeAllFrom(列表)
列表=[]
列表.附加(列表元素(“x”,20))
列表.附加(列表元素(“y”,25))
list.append(liselement(“z”,10))
列表.附加(列表元素(“m”,15))
list.append(ListElement(“n”,8))
列表.附加(列表元素(“p”,22))
def find_chain():
chains=[ChainElement(无,列表[0])]
对于列表[1:]中的le:
新的_链=[]
对于链中的ce:
新链=链元素(ce、le)
如果new_chain.value==50:
返回新的\u链
elif新链价值<50:
新链。追加(新链)
链。延伸(新的_链);
一无所获
而列表:
tuple=find_chain()
如果是元组:
打印“找到:”,元组
tuple.removeAllFrom(列表)
其他:
打印
打印“残留物:”,列表
打破

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

如果您展示迄今为止开发的代码,作为一个最低限度的完整工作示例,将更容易提供帮助。哦,我明白了,因为我一直在使用硬代码来查看它是否能工作,所以我没有考虑过这一点。您有什么建议可以帮助我开始使用您建议的解决方案吗?我是Python的新手,对Python非常熟悉。非常感谢。我自己也是python的新手,所以我也必须对这个示例进行大量的研究。我可以用伪代码(或Smalltalk)写下算法,但您必须从中编写工作的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