2011-02-05 3 views
1

I는 아래와 같이 튜플에서 만들어진리스트를 가지고효율적인 비교

(2809.3994479562093, 1032.5989696312365, 0.0), {'level': '2', 'id': '1'}) 

사전에 레벨 키에 대해 서로 다른 값의 정을 갖는 (증가하지만 1, 2, 3, 3B, 4A, 5, 5A, 6, 7 등의 정수), 점진적으로 증가하는 ID는 정수로만 구성됩니다.

내가 알아 내려고하는 것은 터플의 첫 번째 요소 즉, 부동 소수점 2809.399 ... 및 1032.5989 ...의 첫 번째 두 값의 값입니다. 레벨이 +/- 인 경우, 내가 현재있는 것과 다른 1. 즉 , 레벨 2 ID 1은 레벨 1에 ID 1을 찾고해야하며, 3.이 다음이기 마련했습니다 무엇

:

for x in xrange(len(net.lifts)): 
    if net.lifts[x][1]["level"] == "2": 
     for y in xrange(len(net.lifts)): 
      if (net.lifts[y][1]["level"] == "1" or net.lifts[y][1]["level"] == "3") and net.lifts[y][1]["id"] == net.lifts[x][1]["id"]: 
       print "edge:" + str(net.lifts[x][0][:2]) + str(net.lifts[y][0][:2]) 

를하고 작동합니다. 그러나 각각의 경우에 대해 긴 if 문을 정의해야합니다. 루프를 7 개 (각 레벨마다 하나씩) 생성하지 않고도이를 추상화하는보다 효율적인 방법 (알고리즘)이 있습니까?

답변

2

두 노트 :.

  1. 당신만큼 당신이 C에서 int i = 0; while (i < N) { /* use xs[i]; */ i++; }를 작성하지 않는 한 당신은 for x in xs: # use x 쓰기, 파이썬에서 for i in range(len(xs)): # use xs[i]를 작성하지 않습니다.
  2. 값의 설명적인 이름으로 named tuple을 사용해보십시오. 또한 데이터 재구성을 고려하십시오. 예를 들어 { level_1: { id_1: (val_1, val_2), id_2: ...}, level_2: ...}과 같은 형식을 사용할 수 있습니다.

실제 문제는 다음과 같습니다. 현재 형식에서도 코드를 일반화 할 수 있습니다. 코드는 레벨이 정수라고 가정합니다 (실제로는 레벨이 정수라고 가정합니다. 시스템의 다음 레벨까지 레벨을 변경하십시오.

for lift in net.lifts: 
    for other_lift in net.lifts: 
     if (lift[1]['id'] == other_lift[1]['id'] and 
      abs(lift[1]['level'] - other_lift[1]['level']) <= 1): 
      # got one 

은 (복잡성이 많다는 빠르고 - 그것은 현재 O(n**2)의) 쉬울 것 더 생각 아웃 데이터 구조와 함께.

+0

아주 좋은 정보. 고맙습니다. 두 레벨의 차이는 엄격하게 1 이하가되어야합니다 (이는 리프트가 둘 다 같은 레벨에 있음을 의미합니다) – user228137

1

데이터를 재구성해야합니다. 순차 형식이므로 사전에있는 것처럼 무작위 액세스를 효과적으로 시도하기 때문에 현재의 형식은 해결하려는 문제에 도움이되지 않습니다. 그것은 당신의 수준이 아닌 경우 "수준에서 +/- 1 당신이에서 현재"이 무엇을 의미하는지 당신이 정의 할 필요가 있다는 점에서 또 다른 문제가 있습니다

'level': 
    'id': 
     (data) 

:

하는 것은 사전에 그것을 재 배열 정수. 즉, 어떤 레벨이 3에서 무엇입니까? 3B, 4A, 4B, ...? 이를 해결하기 위해 레벨을 정수로 다시 정의하고 문자열 이름에서 정수 값으로 매핑을 저장하려고합니다. 정수의 수준을 저장하기위한 좋은 데이터 형식입니다