从字典中创建字典列表的更多Python方法,其中列表元素是形式为{{v:[k1,k2,k3]}}的字典

时间:2019-06-29 01:42:38

标签: python

我需要根据字典创建字典列表。原始字典将必须具有键不重复但值可以重复的键。例如:

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

我看过其他一些人可能会认为与该问题重复的问题,但是这些问题的答案并未涵盖如何将字典转换为词典列表。应该如何转换字典有很多答案,这有点像我想做的,但我不是在反转字典。有答案显示从字典创建元组,但是我确实需要词典列表,而不是不可变元组。

7 个答案:

答案 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']}