我需要根据字典创建字典列表。原始字典将必须具有键不重复但值可以重复的键。例如:
{ 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2}
我需要从上面创建一个像这样的字典列表:
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}]
我尝试了什么?我已经尝试过了,但它确实有效,但是我敢肯定,有更好的方法可以达到相同的结果。
lofd=[]
origdict = { 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2}
for i in origdict.items():
k = i[0]
v = i[1]
try:
d[v].append(k)
except:
d = {v:[]}
d[v].append(k)
if d not in lofd:
lofd.append(d)
lofd
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}]
我看过其他一些人可能会认为与该问题重复的问题,但是这些问题的答案并未涵盖如何将字典转换为词典列表。应该如何转换字典有很多答案,这有点像我想做的,但我不是在反转字典。有答案显示从字典创建元组,但是我确实需要词典列表,而不是不可变元组。
答案 0 :(得分:3)
我建议以下内容。未经测试。
from collections import defaultdict
a = { 'b': 66, 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2}
t = defaultdict(list)
for k, v in a.items():
t[v].append(k)
o = [dict((p,)) for p in t.items()]
答案 1 :(得分:3)
您也可以使用列表理解来做到这一点:
[dict((_, )) for _ in {v: [_k for _k, _v in d.items() if _v == v] for v in d.values()}.items()]
显示其效果
>>> d = { 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2}
>>> [dict((_, )) for _ in {v: [_k for _k, _v in d.items() if _v == v] for v in d.values()}.items()]
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}]
注意:我不特别知道这是什么用途,但如果可以的话,我建议使用dict而不是字典列表,因为这种理解比仅仅使用dict理解要慢。如果可能的话,我建议只使用dict理解,虽然返回一个dict而不是更加pythonic 的dict列表,但我认为这会更好,尤其是因为您可以与dict.items()
相同。
{v: [_k for _k, _v in d.items() if _v == v] for v in d.values()}
这将返回一个字典,如下所示:
{68: ['b', 'c', 'x'], 401: ['z', 'aa'], 2: ['a']}
答案 2 :(得分:1)
找出列表中是否包含所需的键,如果包含,则将值附加到列表中。否则,请添加新词典:
a = { 'b': 66, 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2 }
b = []
for key, val in a.items():
if (any(val in d for d in b)):
b[next(i for i, d in enumerate(b) if val in d)][val].append(key)
else:
d = {}
d[val] = [key]
b.append(d)
print(b)
输出:
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}]
答案 3 :(得分:1)
也许是这样。
a = { 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2}
b = {}
for k, v in a.items():
b.setdefault(v, []).append(k)
c = [{k: b[k]} for k in b]
print(c)
输出:
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}]
答案 4 :(得分:0)
有些相同,但有所优化:
a = { 'b': 66, 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2}
b = {}
for k,v in a.items():
val = b.get(v,[])
val.append(k)
b[v] = val
lst = []
for k,v in b.items():
d = dict()
d[k] = v
lst.append(d)
print(lst)
输出:
[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}]
答案 5 :(得分:0)
Enumerate()方法向可迭代对象添加一个计数器,并以枚举对象的形式返回。
#myUL
O / P:
$(document).ready(function() {
$('#myUL > li').each(function() {
var lenLi = $(this).find('ol').children('li').length;
if (lenLi == 0) {
$(this).remove();
}
})
})
答案 6 :(得分:0)
在这种情况下使用defuhaltdict
from collections import defaultdict
dic = defaultdict(list)
k= { 'b': 66, 'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa':401, 'a': 2}
for ke, v in k.items():
dic[v]+=[ke]
print(dict(dic))
输出
{68: ['b', 'c', 'x'], 401: ['z', 'aa'], 2: ['a']}