2016-05-31 2 views
-4

두 개의 열 (이름, 수량)이있는 .xml을 가져 왔습니다. 예를 들어 x - 10, y - 35, z - 42, n - 5, m - 3 및 p - 5와 같이 그룹의 이름을 50 개의 그룹으로 그룹화하는 함수를 작성하려고합니다. "x, y, n"및 "z, m, p". n이 먼저 발생하기 때문에 "x, y, p"를 반환하지 않습니다. 또한 루프의 첫 번째 반복 이후 z, m 또는 p는 사용하지 않았지만 두 번째 반복에서 고려할 것이지만 첫 번째 반복에서 이미 사용 된 이름은 무시합니다.목록을 반복하고 특정 요소를 건너 뛸 수 있습니까?

작은 예제의 경우, 제한된 지식으로이 코드를 만들 수 있습니다. 그러나 이것을 1000 개가 넘는 이름에 적용해야하는데, 대부분 while과 if/else 루프로 구성된 코드는 너무 비효율적입니다.

단지 조금 더 소개 : 본질적으로 세 부분으로 세분화되는 코드 : (A) 합이 50이되면 - 50 미만, (A) (C까지 계속하는 경우> 출력 (B)를) 50보다 큰 경우 프로그램에서 방금 추가 한 번호를 무시하고 목록에서 다음 번호를 시도하고 (A)에 도달 할 때까지 조건 (B)을 테스트합니다.

저는 주로 (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에 도달하면 목록을 통해 하나의 반복을 중지합니다. 체인 요소가 목록에서 제거되고 튜플이 없어 질 때까지 프로세스가 반복됩니다 찾을수있다.

는 약속대로

파이썬 코드 : (이것은 내 첫 번째 파이썬 프로그램 :-) 스타일을 용서하다)

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

오, 나는 그것이 작동 하는지를보기 위해 하드 코드를 사용하고 있었기 때문에, 나는 그것을 고려하지 않았다. 제안한 솔루션을 시작하도록 제안 할만한 의견이 있습니까? 나는 파이썬에서 초보자이며 내 머리 위로 길을 느낀다. 정말 고맙습니다. – RPB

+0

저는 파이썬에서 초보자이기 때문에,이 예제를 꽤 많이 사용해야 할 것입니다. 난 의사 코드 (또는 스몰 토크) 알고리즘을 적어 수 있지만 그에서 작업 파이썬 코드를 작성해야 겠어 ... –

+0

물론! 가짜 코드는 좋을 것 같습니다. 나는 거기에서 관리 할 수 ​​있다고 생각합니다. 미리 감사드립니다. – RPB

관련 문제