2013-05-02 3 views
1

두 부분이 k1과 k2 인 키로 사전 딕트를 작성하려고합니다. k1은 실제 키이고 k2는 dict [k1, k2]의 길이입니다. 아래 예제에서 k1은 'cat'이고 k2는 10입니다. k2는 값 목록의 크기이며 키의 고유성에 기여하지 않습니다. I이었다 무슨 짓을 여러 부분 키가있는 사전 구성

dict = { 
     cat, 10: [value1, value2, value3, ..., value10], 
     dog, 15: [value1, value2, value3, ..., value15], 
     zen, 15: [value1, value2, value3, ..., value15] 
     } 

는 키가 다음 구현에 이르는 실제로 k1k2 의미하는 후 연결된 K1과 K2를 K2없이 DICT를 구현합니다.

if key not in dict: 
    dict[key] = [value1] 
else: 
    if value_n not in dict[key]: 
    dict[key].append(value_n) 

for key in dict: 
    key = key + str(len(dict[key])) 

이제 dict은 다음과 같이 나타납니다.

dict = { 
     cat10: [value1, value2, value3, ..., value10], 
     dog15: [value1, value2, value3, ..., value15], 
     zen15: [value1, value2, value3, ..., value15] 
     } 

별도의 데이터 구조에 k2를 저장하지 않으려면 사전에 여러 부분 키를 구현할 수 있습니까?

+1

튜플을 사용해 보았습니까? 예 :'('cat', 10) : [value1 ..., value15]'? –

+1

len (dict [cat])을 사용할 수있는 주어진 시간에 len을 저장하려는 이유 10 –

+0

@Jon : 튜플을 인식하지 못합니다. 댓글 주셔서 감사합니다. 저를 살펴 봅시다. – user2342347

답변

2

여기에 어떤 용도로 사용되는지 정확히 모르겠습니다. 하지만 몇 가지 옵션 중 하나를 수행 할 수 있다고 생각됩니다. 그리고 그것은 "길이"키 (k2)가 목록을 만드는 것인지 아니면 단지 그것을 나타내는 지에 달려 있습니다.

dict = { 
     'cat' : {10: [value1, value2, value3, ..., value10]}, 
     'dog' : {15: [value1, value2, value3, ..., value15]}, 
     'zen' : {15: [value1, value2, value3, ..., value15]} 
     } 

는 그래서 액세스 dict['cat'][10] 것하고 "길이"(K2)는 단순히 길이의 지표 인 경우이 작동합니다 :


당신은 중첩 된 사전을 사용할 수 있습니다.


"키"에 액세스하고 값을 원하는 길이를 지정할 수있는 사용자 정의 클래스를 만들 수 있습니다. 클래스의 방법은 같은 것을 다음과 같습니다

def method(self, key, length): 
    return self.__dict__[key][:length] 

당신은 당신의 키로 튜플을 사용할 수

dict = { 
     ('cat', 10) : [value1, value2, value3, ..., value10], 
     ('dog', 15) : [value1, value2, value3, ..., value15], 
     ('zen', 15) : [value1, value2, value3, ..., value15] 
     } 
+0

중첩 된 dict에서 한 가지를 볼 수 있습니다. 나중에 프로그램에서 사용자가 뭔가를 추가하거나 삭제하려는 경우 (예 : 고양이 값 11), DICT는 고양이 dict에 모두 10 및 11을 사용하게됩니다 –

+0

@RohitSrivastava 죄송합니다. 귀하의 의견은 나에게 이해가되지 않습니다. 다시 시도해 주시겠습니까? 또는 코드에서 예제를 설명하고 http://pastebin.com/을 링크 할 수 있습니까? –

+0

OP에는 길이를 추가하는 용도가 있습니다. 고양이에 값 11을 더하고 싶다고 가정 해 봅시다 : {10 : [value1, ...., value 10]}. 그 값을 더하고이를 사용하면 고양이가 될 수 있습니다. {10 : [값 1, ..., 값 10], 11 : [값 1, ..., 값 11] 또는 다른 어떤 경우가있을 수 있습니다. 구현에 따라 다릅니다. OP는 그런 것들을 돌봐야합니다. –

1

당신은 __eq__ 및 구현 __hash__으로 클래스를 생성 할 수 있습니다. 그럼 당신은 사전 키로 클래스의 인스턴스를 사용할 수 있습니다

class MyKey(object): 
    def __init__(self, animal, length): 
     self.__animal = animal 
     self.length = length 

    @property 
    def animal(self): 
     return self.__animal 

    def __hash__(self): 
     return hash(self.__animal) 

    def __eq__(self, other): 
     return self.__animal == other.animal 

    def __repr__(self): 
     return "{0}({1}, {2})".format(
      self.__class__.__name__, self.animal, self.length) 

을 당신이 키로만 동물을 사용하려면 내가 그에서 제대로 이해 한 희망, 그냥 번들 가진 우유없는 그것으로 길이 이는 키의 고유성에 영향을 미칩니다.

내가 알기로는 동물을 읽기 전용 속성으로 만들고 이름 속성을 변경하여 실수로 해당 속성을 변경하지 못하게했습니다. 당신이 dict 키로 사용하는 인스턴스에 그렇게하면, 나쁜 것 TM이 발생합니다.

d = {} 
d[MyKey("ox", 9)] = "a" 
d[MyKey("ox", 3)] = "b" 
assert len(d) == 1 
# will the key have value 9 or 3? I wouldn't depend on it always being the same. 
print d.keys() 

를 이제이 같은 코드를 가질 수 있습니다 다음 DICT가 MyKey("ox", 3) 같은 키로 MyKey("ox", 9)를 볼 수 있기 때문에,이 같은 코드의 행동이 내가 아는까지로, 지정되지 않은 것을

key = MyKey(animal, 0) 
if key not in mydict: 
    mydict[key] = [value1] 
else: 
    if value_n not in mydict[key]: 
     dict[key].append(value_n) 

for key, value in mydict.items(): 
    key.length = len(value) 

이 모든 것은 당신이 아마 다른 방법으로이 문제를 해결 나을 이야 말했다되고. 길이가 필요할 때 len(value)으로 직접 전화를 걸 수없는 이유는 무엇입니까? 이것은 매우 빠른 연산입니다 (사실, 기본 파이썬 객체의 미리 계산 된 변수를 읽습니다).

+0

자세한 답변 해 주셔서 감사합니다. 궁극적으로 궁금한 점이 있다면, k2는 실제로 가치 목록이 채워지는 동안 상호 유도 된 값입니다. 나는 문제를 단순하게 유지하기 위해 여기서 k2를 길이로 사용했다. – user2342347