2011-10-11 2 views
0

목록으로 문자열을 가진 A, 오프셋이 x이라고 가정하고 목록의 increaseKey를 만듭니다. x is int
len(A) is int목록에

A=["a","b","c"]
나는 직렬화 및 JSON을 반환해야 J 등이 각 n<len(A)
J[x+n]=a[n]

나는 현재 DICT 할당을 사용하지만, 뭔가 더 자신처럼 느낀다 효율적인 대신 넘어 가기 전체 목록.

답변은 O(1)이거나 모순이되어야합니다.

감사합니다.

dict={} 

for i,x in enumerate(List): 
    dict[i+offset]=x 
+0

사전 지정을 통해 코드를 표시 할 수 있습니까? – eumiro

+0

@eumiro 간단한 순회입니다. 아무 것도 이해하지 못함 – shevski

+0

변수 이름은 몇 가지 교훈으로 할 수 있습니다. ('dict = {}'와 같이) 내장 변수를 숨기지 말고, 표준 변수 이름과 로트에 대해서는 [PEP 8] (http://www.python.org/dev/peps/pep-0008/)를 읽어라. 더 유용한 물건. –

답변

2

당신은 정말 dict에서 구성하지 않으려면

class OffsetDict(dict): 
    def __init__(self, lst, offset): 
     self.lst = lst 
     self.offset = offset 
    def __nonzero__(self): 
     return bool(self.lst) 
    def iteritems(self): 
     return enumerate(self.lst, self.offset) 

A = ["a", "b", "c"] 
d = OffsetDict(A, 5) 
print json.dumps(d) 

위의 코드를 인쇄

,369 : 목록, 당신은 json 모듈의 구현 세부 사항에 따라 해킹을 사용할 수 있습니다
{"5": "a", "6": "b", "7": "c"} 

OffsetDict 인스턴스를 구성해도 목록이 반복되지 않으므로이 부분은 O (1)이됩니다. 필연적으로 JSON 출력을 생성하는 것은 물론 O (n)로 남습니다.

코드는 json 취급합니다 dictdict의 모든 하위 클래스 만 __nonzero__()iteritems() 메소드를 호출한다는 사실에 의존한다. 코드가 매우 강력 할 것으로 기대하지 마십시오.보다 견고한 버전은 dict의 모든 메소드를 다시 구현해야합니다.

파이썬 3.x에서는 iteritems() 대신에 items()을 덮어 씁니다.

+0

에서 확인할 수 있습니다. 'dict'을 감쌀 수 있다는 것을 모릅니다. – shevski

+0

@shevski : 이해하십시오 위의 클래스가'dict'에서 파생 된 유일한 이유는'json' 모듈을 속여서이 클래스의 인스턴스를'dict'으로 처리하는 것입니다. 실제로는 "포장 된 dict"이 아닙니다. –

1

을 감안할 때 다음과 같은 변수 (변수 이름과 같은 DICT/목록을 사용하지 않습니다!) :

offset = 5 
A = ["a","b","c"] 

귀하의 예제 코드는 다음과 같이 쓸 수있다 :

d = dict(zip(range(offset, offset+len(A)), A)) 

또는 import itertools as it를 사용하여 :

d = dict(it.izip(it.count(offset), A)) 

또는 (파이썬 2.6 이상) : 모든 경우 d에서

d = dict(enumerate(A, offset)) 

지금 {5: 'a', 6: 'b', 7: 'c'}입니다. 속도를 비교하면 첫 번째 속도가 가장 느리고 후자의 두 속도 간에는 큰 차이가 없습니다.

0

생성자생성자는 dict을 생성하기 위해 반복 가능한 키 - 값 쌍을 사용할 수 있습니다. 그래서, 당신은 할 수 있습니다 :

some_dictionary = dict((i + offset, x) for i, x in enumerate(some_list)) 
새로운 파이썬에서

(2.7 3.X), DICT 이해를위한 특수 구문있다 :

some_dictionary = {i + offset: x for i, x in enumerate(some_list)} 
0

길이가 offset 인 A를 왜 앞에 추가하지 않으시겠습니까?

result = [None] * offset + A 
+0

삽입하려면 O (오프셋)가 필요합니다. – shevski

+0

목록에서 dict을 작성하는 것은 적어도 O (len (A))입니다. O (1)을 가질 수있는 유일한 방법은 JSON 클라이언트를 수정하여 색인 (x - 오프셋)에서 항목을 얻는 것입니다 :-) – pyos