2013-06-05 2 views
0

같은 길이의 사전에 있습니다. 그리고 두 개의 색인이 있습니다. 내가해야 할 일은 새로운이 같은 사전 만드는 것입니다 : index1의에서 사전에 지정된 색인을 파이썬으로 결합하십시오.

  • 요소는 사전에서 길이 index2에서 dictionary2에서
  • 요소를 index2하는 dictionary1로부터 index1의 0 ~

    • 요소를 1

    L = len(dic1) 
    result = {} 
    ini = random.randint(0,L-1) 
    end = random.randint(inici+1,L) 
    i = 0 
    while i < ini: 
        key = dic1.keys()[i] 
        vaue = dic1.get(key) 
        result[key] = value 
        i += 1 
    
    while i < end: 
        key = dic2.keys()[i] 
        vaue = dic2.get(key) 
        result[key] = value 
        i += 1 
    
    while i < L: 
        key = dic1.keys()[i] 
        vaue = dic1.get(key) 
        result[key] = value 
        i += 1 
    
    return result 
    

    을하지만 몇 가지 반복으로 실행할 때 :

    나는이 시도했다 뭔가 잘못된 결과가 나올 때가 있습니다. dic1과 dic2와 길이가 같지 않기 때문입니다. 너 나 좀 도와 줄 수있어?

    감사합니다.

  • +0

    사전은 주문하지 않습니다. '.keys()'에 어떤 순서로 기대 했습니까? –

    +0

    주문이 중요합니까? 나는 단지 요소의 순서대로 dic1과 dic2에 있습니다. – user2457716

    +0

    예, 순서가 중요합니다. 사전의 삽입 및 삭제 기록에 따라'.keys() '에 의해 retired 된 키의 순서는 현재 내용이 동일하더라도 완전히 다를 수 있습니다. –

    답변

    -2

    사전은 시퀀스가 ​​아니기 때문에 길이가 없습니다. 따라서 dict 자체가 정의한 키 범위에 대한 자연스러운 정의는 없습니다.

    아마도 어떤 식 으로든 키를 정렬 할 수 있습니다.

    +0

    하지만 예를 들어 len (dic1)을 실행하면 사전에 요소 수가 나옵니다. 그렇지 않습니까? – user2457716

    +2

    사전 ** do ** 길이가 있습니다. 사전의 키 수는 사전의 길이를 정의합니다. –

    +0

    @MartijnPieters 아직 길이가 아닙니다. – Marcin

    0

    OrderedDict부터 collections까지 키를 정렬 된 상태로 유지할 수 있지만 원하는대로 주문을 유지하기 위해 키를 조정해야합니다. 이는 그리 좋지 않습니다.

    당신은 또한 서브 클래스 딕셔너리는 세 dicts에 대한 참조를 포함하는 동안, 딕셔너리에 대한 모든 메소드를 구현 메타 DICT의 어떤 종류를 생성하고 keys() 방법 세 가지 dicts의 목록의 연결을 반환 할 수 있습니다 뭔가 가까이 : 물론

    class MetaDict(dict): 
        def __init__(self, d1, d2, d3): 
         self.d1 = d1 
         self.d2 = d2 
         self.d3 = d3 
    
        def keys(self): 
         return self.d1.keys() + self.d2.keys() + self.d3.keys() 
    
        ... 
    

    당신은이 DICT처럼 행동 할 __getitem__(), __setitem__(), __iter__(), iteritems() 및 다른 모든 서브 클래스해야합니다. 그리고 아이템 설정을 처리하는 방법을 과감히 선택해야합니다 ... 물론 dict() 서브 클래스를 피할 수 있고, dict처럼 행동하는 클래스를 생성하고 메소드 만 정의하면됩니다. 나중에 사용하십시오.

    관련 문제