2016-05-31 77 views
-4

我用两列(名称,数量)导入了一个.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)而苦苦挣扎。

在此先感谢您的帮助!

+4

如果你展示你迄今为止开发的代码,作为一个最小的完整工作示例,它很容易帮助你。 – Conor

回答

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 

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

+0

哦,我明白了,因为我一直在使用硬代码来判断它是否有效,所以我没有考虑到这一点。你有什么建议可以帮助我开始使用你建议的解决方案吗?我是Python的新手,感觉自己满脑子。非常感谢。 – RPB

+0

我是python的新手,所以我不得不在这个例子上做很多工作。我可以使用伪代码(或Smalltalk)写下算法,但是您必须从中编写工作Python代码... –

+0

当然!伪代码会很棒,我想我可以从那里管理。先谢谢你! – RPB