python 字典中的可变长度值

python variable length values in dictionary

我有这样的字典:

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

我想要 return 这个功能: 0:[],1:[], 2:['Joe'], 3:['Joe'], 4:['Joe'], 5:['Joe','Bob'], 6: ['Joe':'Bob'], 7:['Joe','Bob','Doug'],等等

相反,它是 returning 这个: 0: ['Joe', 'Bob', 'Doug'], 1: ['Joe', 'Bob', 'Doug'], 2: ['Joe', 'Bob', 'Doug'], 3: ['Joe', 'Bob', 'Doug'] ...

我认为它没有按照我希望的方式工作,因为列表的长度正在改变。有办法解决这个问题吗?

你的基本问题是

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']}
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)