2015-02-26 4 views
-1

У меня есть словарь, как это:питона значение переменной длиной в словаре

d1 = {2: 'Joe', 5: 'Bob', 7: 'Doug', 9 : 'Bob', 10 : 'Doug', 12 : 'Joe', 15 : 'Dave'} 

Я хочу использовать его, чтобы заполнить другой словарь, как это:

def MakeDict(): 
    d, myList = {}, [] 
    for num in range(np.max(d1.keys())+1): 
     value = d1.get(num) 
     if value != None and value not in myList: 
      myList.append(value) 
     d[num] = myList 
    return d 

Я хотел бы функцию, чтобы вернуться это: 0: [], 1: [], 2: ['Joe'], 3: ['Joe'], 4: ['Joe'], 5: ['Joe', 'Bob'], 6 : ['Joe': 'Bob'], 7: ['Joe', 'Bob', 'Doug'] и т. Д.

вместо этого он возвращает это: 0: ['Joe', 'Bob', 'Doug'], 1: ['Joe', 'Bob', 'Doug'], 2: ['Joe', 'Bob', 'Doug'], 3 : ['Joe', 'Bob', 'Doug'] ...

Я предполагаю, что это не работает так, как мне бы хотелось, потому что меняется список из списка. Есть ли способ обойти это?

+3

Не возражаете, объясняя «3: ['7'], 4: ['7'], 5: ['7', '1'], 6: ['7': '1'], 7: [ '7', '1', '25'] '? – thefourtheye

+2

Какова логика этого? Почему у вас есть, например, '5: ['7', '1']' в вашем ожидаемом выходе? – Marcin

ответ

2

Ваша основная проблема заключается в том, что

mylst = [] 
d1[1] = mylst   # this is a reference, not a copy! 
mylst.append('Joe') # modify the object... 
d1[1]     # => ['Joe'] ! 

Вместо этого, вы хотите

mylst = [] 
d1[1] = mylst[:]  # make a copy 
mylst.append('Joe') 
d1[1]     # => []  # what you expected 

d1 = {2: '7', 5: '1', 7: '25', 9 : '1', 10 : '25', 12 : '1', 15 : '55'} 

d2, lst, seen = {}, [], set([None]) 
for i in range(max(d1) + 1): 
    val = d1.get(i) 
    if val not in seen: 
     seen.add(val) 
     lst.append(val) 
    d2[i] = lst[:] 

, который дает

{0: [], 
1: [], 
2: ['7'], 
3: ['7'], 
4: ['7'], 
5: ['7', '1'], 
6: ['7', '1'], 
7: ['7', '1', '25'], 
8: ['7', '1', '25'], 
9: ['7', '1', '25'], 
10: ['7', '1', '25'], 
11: ['7', '1', '25'], 
12: ['7', '1', '25'], 
13: ['7', '1', '25'], 
14: ['7', '1', '25'], 
15: ['7', '1', '25', '55']} 
+0

Я предполагаю, что я не уточнил в вопросе, но я не хочу дублировать значения – user2333196

+0

@ user2333196: обновлено. –

1
d1 = {2: '7', 5: '1', 7: '25', 9 : '1', 10 : '25', 12 : '1', 15 : '55'} 
d2 = {} 
prev = [] 
for i in range(max(d1.keys())+1): 
    if i in d1: 
     d2.setdefault(i, [x for x in prev]).append(d1[i]) 
    else: 
     d2[i] = prev 
    prev = d2[i] 
print(d2) 
Смежные вопросы