反向键(由列表组成)和Python字典中的值

Jen*_*ens 2 python dictionary list-comprehension state-machine

我一直试图从这里的其他帖子中解决这个问题,但不能.

我有一本Python字典

old_dict = { (1,'a') : [2],
          (2,'b') : [3,4],
          (3,'x') : [5],
          (4,'y') : [5],
          (5,'b') : [3,4], 
          (5,'c') : [6],
          }
Run Code Online (Sandbox Code Playgroud)

我需要反转这个,以便结果我会:

new_dict = { (6,'c') : [5],
          (5,'x') : [3],
          (5,'y') : [4],
          (4,'b') : [5, 2],
          (3,'b') : [5, 2], 
          (2,'a') : [1],
          }
Run Code Online (Sandbox Code Playgroud)

(这描述了有限状态机的边缘,我需要向后运行它:它必须像之前那样接受反向输入)

例如,在old_dict中,第一个键是一个列表(1, 'a') : [2],现在,这个键应该变成(2, 'a'), [1]......或者(4,'y') : [5]变成(5,'y') : [4]等等. - 我希望我的意思是可以理解的.

我一直试图用列表推导来解决这个问题,但还没有成功.

更新:我尝试了FC的建议,但不知怎的,我无法让代码工作.我将它插入到一个函数中,如下所示:

old_dict1 = { (1,'a') : [2],
          (2,'b') : [3,4],
          (3,'x') : [5],
          (4,'y') : [5],
          (5,'b') : [3,4], 
          (5,'c') : [6],
          }

def reverse_dict(old_dict):
    new_dict = {}
    add_to_dict = new_dict.setdefault

    map(lambda kv: add_to_dict(kv[0], []).append(kv[1]),   
        sum([[((x, k[1]), k[0]) for x in v] for k, v in old_dict.items()],
            []))        # sum will take this to start adding
    return new_dict

new_dict1 = reverse_dict(old_dict1)

print(new_dict1)
Run Code Online (Sandbox Code Playgroud)

但我只收到一本空字典 {}

难道我做错了什么 ?(我对Python知之甚少,所以如果我犯了一个太傻的错误,请原谅我......)

sen*_*rle 8

这很复杂,我不打扰列表推导.另外,我假设你不是在寻找任何严格的价值表.

new_dict = {}
for k, vals in old_dict.items():
    k_num, k_char = k
    for num in vals:
        new_dict.setdefault((num, k_char), []).append(k_num)
Run Code Online (Sandbox Code Playgroud)

或者使用defaultdict:

new_dict = collections.defaultdict(list)
for k, vals in old_dict.items():
    k_num, k_char = k
    for num in vals:
        new_dict[(num, k_char)].append(k_num)
Run Code Online (Sandbox Code Playgroud)

对于那些有兴趣尽可能简洁的人来说,我发现这个更加压缩的版本也是一个选项.从可读性的角度来看,我不确定我对此的看法,所以我更改了变量名称以便更清晰:

new_dict = collections.defaultdict(list)
for (num_in, char_in), nums_out in old_dict.items():
    for num_out in nums_out:
        new_dict[(num_out, char_in)].append(num_in)
Run Code Online (Sandbox Code Playgroud)