2009-03-17 4 views
10

먼저, 파이썬에 새로 온 사람, 그래서 내가 뭔가를 간과 한 경우 나는 사과,하지만 난의 키가 다른 목록에 제공되는 목록의 사전을 만들 수 dict.fromkeys (또는 비슷한)를 사용하고 싶습니다. 좀 타이밍 테스트를 수행하고있어 키가 입력 변수 목록이 실행을위한 시간을 포함 할 수 있도록 내가 좋아하는 것 :dict.fromkeys를 사용하여 각 키에 고유 한 값을 만드는 방법은 무엇입니까?

def benchmark(input): 
    ... 
    return time_taken 

runs = 10 
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55) 
results = dict.fromkeys(inputs, []) 

for run in range(0, runs): 
    for i in inputs: 
     results[i].append(benchmark(i)) 

내가 데 문제가 그 모든 키에 사전은 동일한 목록을 공유하는 것처럼 보이며 각 실행은 간단히 그 목록에 추가됩니다. fromkeys을 사용하여 각 키에 고유 한 빈 목록을 생성하는 방법이 있습니까? 그렇지 않은 경우 결과 사전을 직접 생성하지 않고이 작업을 수행 할 다른 방법이 있습니까?

답변

10

문제

results = dict.fromkeys(inputs, []) 

[]

에 바로 한번만 평가된다는 점이다.

나는 그런이 코드를 다시 작성할 것

:

runs = 10 
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55) 
results = {} 

for run in range(runs): 
    for i in inputs: 
     results.setdefault(i,[]).append(benchmark(i)) 

다른 옵션은 다음과 같습니다 내가 추천하지만 당신이 (새로운 것을 배울하지 않으려면

runs = 10 
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55) 
results = dict([(i,[]) for i in inputs]) 

for run in range(runs): 
    for i in inputs: 
     results[i].append(benchmark(i)) 
+0

최고, 잘 작동 : 내가 먼저 "맞춤법 교정기를 작성하는 방법", 피터 노르 빅의 그것에 대해 들었어요! 감사! (사용하기 전에 빈 목록을 생성 할 수 있었으면 좋겠지 만) –

+0

불가능합니다. [] 또는 list()를 호출하면 객체가 만들어지고 변수가 바인딩됩니다. 예를 들어이 x = [[]] * 10을 확인하십시오. x [0] .append ('test'); print x – vartec

+0

자, 모든 목록이 인스턴스화 된 대안이 있습니다. – vartec

12

체크 아웃 defaultdict (파이썬 2.5 이상이 필요합니다).

from collections import defaultdict 

def benchmark(input): 
    ... 
    return time_taken 

runs = 10 
inputs = (1, 2, 3, 5, 8, 13, 21, 34, 55) 
results = defaultdict(list) # Creates a dict where the default value for any key is an empty list 

for run in range(0, runs): 
    for i in inputs: 
     results[i].append(benchmark(i)) 
+0

잘 작동합니다. 나는 단지 그것이 진짜 인 "진짜"사전 이었으면 좋겠다. –

+0

공정하게 말하자면, 최소한의 변화 만이있는 서브 클래스이기 때문에 "하나 인 척하는 것"이 ​​약간 강하게 보인다. –

+0

+1 Python <2.5에서 코드를 사용할 필요가 없다고 확신 할 수 있다면 그렇게 할 수 있습니다. (최근에 나는 호스팅 제공을 살펴 보았고 여전히 Python 2.4를 많이 사용하고있다). – vartec

2

또한이 작업을 수행 할 수 있습니다 너는 어떤 방법으로 더 빠를까?

results = dict.fromkeys(inputs) 

for run in range(0, runs): 
    for i in inputs: 
     if not results[i]: 
      results[i] = [] 
     results[i].append(benchmark(i))