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

标签 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],
          }

我需要扭转它,因此我会:

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

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

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

我一直在尝试用列表理解来解决这个问题,但还没有成功。

更新: 我试过 F.C.的建议,但不知何故我无法让代码工作。我将它插入到函数中,如下所示:

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)

但我只返回一个空字典 {}

我做错了什么吗? (我对Python的了解真的很少,所以如果我犯了太愚蠢的错误,请原谅我......)

最佳答案

这已经足够复杂了,我不会为列表理解而烦恼。另外,我假设您不希望值列表具有任何严格的顺序。

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)

或者使用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)

对于那些希望尽可能简洁的人,我突然想到这个压缩程度更高的版本也是一种选择。从可读性的角度来看,我不确定我对此有何看法,因此我更改了变量名称以更加清晰:

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)

关于python - Python 字典中的反向键(由列表组成)和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857907/

相关文章:

python - 唯一常量引用

python - 上传代码到服务器并自动运行

java - 迭代Hashmap时更新不同的项目

用于从文件发布数据的 Python 等效于 curl

java - 将 RDD 的值映射到它们的字典值

c++ - 使用另一个 map 的值更新 map

python - list-comprehension "create list"和 "append elements"与简单循环有何不同?

python - 如果另一个类属性与列表中的另一个匹配,则添加类属性

python - 将一个复杂的字符串 ('2,3-5,50-60,70' ) 分解到列表中

android - kivy:水平ListView