我正在尝试根据name_num
字典中的值创建字典,其中列表的长度是新密钥,name_num
字典键和值是值。所以:
name_num = {"Bill": [1,2,3,4], "Bob":[3,4,2], "Mary": [5, 1], "Jim":[6,17,4], "Kim": [21,54,35]}
我想创建以下字典:
new_dict = {4:{"Bill": [1,2,3,4]}, 3:{"Bob":[3,4,2], "Jim":[6,17,4], "Kim": [21,54,35]}, 2:{"Mary": [5, 1]}}
我尝试了很多变化,但这段代码让我最接近:
for mykey in name_num:
new_dict[len(name_num[mykey])] = {mykey: name_num[mykey]}
输出:
new_dict = {4:{"Bill": [1,2,3,4]}, 3:{"Jim":[6,17,4]}, 2:{"Mary": [5, 1]}}
我知道我需要以某种方式遍历代码,以便我可以将其他值添加到密钥3。
答案 0 :(得分:22)
这是defaultdict
的一个很好的用例:
from collections import defaultdict
name_num = {
'Bill': [1, 2, 3, 4],
'Bob': [3, 4, 2],
'Mary': [5, 1],
'Jim': [6, 17, 4],
'Kim': [21, 54, 35],
}
new_dict = defaultdict(dict)
for name, nums in name_num.items():
new_dict[len(nums)][name] = nums
print(dict(new_dict))
<强>输出强>:
{
2: {'Mary': [5, 1]},
3: {'Bob': [3, 4, 2], 'Jim': [6, 17, 4], 'Kim': [21, 54, 35]},
4: {'Bill': [1, 2, 3, 4]}
}
答案 1 :(得分:5)
Dictionary,关联数组或映射(许多名称,基本上是相同的功能)属性是键是唯一的。
如果长度相同,那么您希望拥有的密钥(整数)并不是唯一的,这就是您的代码无法工作的原因。为现有密钥设置新值意味着替换旧值。
您必须将键值对添加到现有值词典中。
for mykey in name_num:
length = len(name_num[mykey])
if length in new_dict: # key already present in new dictionary
new_dict[length][mykey] = name_num[mykey]
else:
new_dict[length] = {mykey: name_num[mykey]}
应该做的伎俩
答案 2 :(得分:4)
只是替代他人;您可以按长度排序并使用itertools.groupby
:
>>> result = {}
>>> f = lambda t: len(t[1])
>>> for length, groups in itertools.groupby(sorted(name_num.items(), key=f), key=f):
... result[length] = dict((k, v) for k, v in groups)
>>> print result
{
2: {'Mary': [5, 1]},
3: {'Bob': [3, 4, 2], 'Jim': [6, 17, 4], 'Kim': [21, 54, 35]},
4: {'Bill': [1, 2, 3, 4]}
}
在最糟糕的情况下,每个内部列表的长度不同,这会执行O(n^2)
,与上面发布的其他解决方案相比效率相当低。