2012-02-26 2 views
2

실행 시간을 수집하기 위해 여러 입력 매개 변수로 여러 번 응용 프로그램을 실행했습니다. v, n, m, b, pc :Python : 다차원 명령

입력 파라미터는 6이다.

개념적으로 나는 어떤 차원이 다른 매개 변수 다차원 배열로 내 결과 생각할 수 : times[A][B][C][D][E][F] 매개 변수 v=A, n=B, m=C, b=D, p=Ec=F를 사용하여 시뮬레이션의 실행 시간을 포함한다.

나는 다른 사람을 통해 이러한 매개 변수의 일부를 수정하고 반복 할 수 있도록하고 싶습니다 :

for A: 
    for C: 
    for F: 
     times[A][0][C][0][0][F] 

입력 값이 스파 스 매개 변수, 그래서 내가 대신 목록의 사전을 사용해야합니다.

내가 모든 일을 할 수 DICT의 DICT의 DICT의 DICT의 DICT의 딕셔너리를 사용하는 방법에 대해 생각했다 는

, 각각의 실행 시간은 다음과 같이 표현 될 것이다 :

times = { A:{ B:{ C:{ D:{ E:{ F:{time} } } } } } } 

하지만이 솔루션은 보이지 않습니다 우아함 : 전체 구조를 만들고 그것을 반복하는 것은 고통입니다.

내 데이터로 작업하는 더 좋은 방법이 있습니까?

+0

't [A, B, C, D, E, F]'할 수 있도록 매개 변수의 튜플로 저장할 수 있습니까? –

+0

@ 토마스 : 튜플 사전으로 일부를 고칠 수 없습니다 변수들에 대해 반복하고 다른 것들에 대해 반복합니다 :'n 번에 대해 [v] : print (times [v] [n] [m] [b] [p] [c])' – peoro

답변

7

먼저 사전을 사용해야하는 경우 튜플을 사용하여 색인을 생성하는 단일 사전을 만들지 않는 이유는 무엇입니까? 둘째, 귀찮은 중첩 루프를 방지하기 위해 itertools.product를 사용

>>> import itertools 
>>> d = {} 
>>> for tup in itertools.product(range(5), repeat=2): 
...  d[tup] = tup 
... 
>>> d 
{(1, 3): (1, 3), (3, 0): (3, 0), (2, 1): (2, 1), (0, 3): (0, 3), (4, 0): (4, 0), 
(1, 2): (1, 2), (3, 3): (3, 3), (4, 4): (4, 4), (2, 2): (2, 2), (4, 1): (4, 1), 
(1, 1): (1, 1), (3, 2): (3, 2), (0, 0): (0, 0), (0, 4): (0, 4), (1, 4): (1, 4), 
(2, 3): (2, 3), (4, 2): (4, 2), (1, 0): (1, 0), (0, 1): (0, 1), (3, 1): (3, 1), 
(2, 4): (2, 4), (2, 0): (2, 0), (4, 3): (4, 3), (3, 4): (3, 4), (0, 2): (0, 2)} 

그러나, 스파 스 배열을 만들 수있는 더 나은 방법이있을 수 있습니다. scipysparse matrices을 제공하지만 2-d에만 해당됩니다. 여기

당신이 유용 할 수있는 몇 가지 다른 사용 패턴은 다음과 같습니다 단지 itertools.product에 하나의 항목 순서를 전달합니다 :

>>> for tup in itertools.product(range(3), [2], range(3)): 
...  print tup 
... 
(0, 2, 0) 
(0, 2, 1) 
(0, 2, 2) 
(1, 2, 0) 
(1, 2, 1) 
(1, 2, 2) 
(2, 2, 0) 
(2, 2, 1) 
(2, 2, 2) 

>>> for tup in itertools.product(range(5), repeat=2): 
...  if tup[0] == tup[1]: 
...   d[tup] = tup 
... 
>>> d 
{(3, 3): (3, 3), (0, 0): (0, 0), (1, 1): (1, 1), (4, 4): (4, 4), (2, 2): (2, 2)} 

>>> for tup in itertools.product(range(5), range(2)): 
...  print d.get(tup) 
... 
(0, 0) 
None 
None 
(1, 1) 
None 
None 
None 
None 
None 
None 

덜 기울어하기 위해, 여기 당신이 하나 개의 변수 상수를 개최 할 방법

+0

그래, 시작, 설명 주셔서 감사합니다! 내가 가지고있는 유일한 문제는 입력 매개 변수에 대한 값을 생성하기 위해'range()'를 사용할 수 없다는 것입니다. 왜냐하면 그것들은 드문 드문 (sparse)이고 어떤 값이 들어 있는지 정적으로 알지 못하기 때문입니다. 내 튜플의 i 번째 요소에있는 값만이 전부입니까? (예 :'itertools.product ([0], [2], elements_present_in_3rd_field_of_my_dict_keys)') – peoro

+0

@peoro 글쎄, 그 질문에 대답하기 위해 당신이하고있는 일에 대해 더 알고 싶을 것 같습니다.모든 기존 키 목록은 쉽게 구할 수 있습니다. 사전에 반복하고 키를 순서대로 정렬하면 정렬 할 수 있습니다. 그리고 당신이 말한 문제는 사전에 값을 삽입하는 데는 적용되지 않습니다. 어떤 유스 케이스에서 당신은 dict에있는 값들에 대해서만 반복 할 필요가있을 것이고,'sorted (d)'는 당신이 원하는 것을주지 않을 것입니다. 어쨌든'range'를 사용할 필요는 없습니다. 당신은 항상'(1, 5, 6, 8) '과 같은 연속열을 사용할 수 있습니다. – senderle

+0

@peoro, 그것에 대해 좀 더 생각해 보면,'k [2] == 5'와 같은 항목들만 반복하고자하는 것처럼 들립니다. 이런 식으로 "행"을 쿼리하는 것이 single-dict의 경우 효율성이 떨어질 수 있습니다. 그렇다면 중첩 된 dict 솔루션이 귀하의 유스 케이스에 맞는 것일 수도 있습니다. 데이터가 얼마나 동적인지에 달려 있습니다. 결과적으로 위의 내용은 생성 및 삽입을 매우 쉽고 빠르지 만 특정 종류의 쿼리를 어렵게 만들고 잠재적으로 느리게 만듭니다. 여전히 키를 반복하고 필터링 할 수 있습니다. 이렇게하면 중첩 된 방식보다 속도가 느려지는지 여부가 데이터에 크게 좌우됩니다. – senderle

1

터플 안에있는 매개 변수의 조합을 키로 사용하여 1 차원 사전을 만들면 훨씬 간단합니다.

times[('v', 'n', 'm', 'b', 'p', 'c')] = value 
+0

이것은 훨씬 더 간단 할 것입니다. 그러나 senderle에서 제안한 것과 같이'itertools.product'와 같은 것을 사용하지 않는 한, 일부 값을 수정하고 다른 것을 반복 할 수는 없습니다. – peoro