秋灯烬 发表于 2022-3-23 09:44:34

困扰两天的关于键值互换的简单问题

本帖最后由 秋灯烬 于 2022-3-23 09:46 编辑

actor_of_movies = {"妖猫传": ["黄轩", "染谷将太", "黄轩"], "无问东西": ["章子怡", "王力宏", "祖峰"], "超时空同居": ["雷佳音", "王力宏", "佟丽娅"]}

这是我的一个字典

我要把他转化成

{'黄轩': ['妖猫传'], '染谷将太': ['妖猫传'], '章子怡': ['无问西东'], '王力宏': ['无问西东', '超时空同居'], '祖峰': ['无问西东'], '雷佳音': ['超时空同居'], '佟丽娅': ['超时空同居']}

这样子,也就是演员对应的电影,但是苦于只学了几天Python,写不出来,又被什么哈西值困扰,有没有大佬能帮帮我,我看一下没准就懂了。

isdkz 发表于 2022-3-23 10:06:03

from functools import reduce
from operator import or_

actor_of_movies = {"妖猫传": ["黄轩", "染谷将太", "黄轩"], "无问东西": ["章子怡", "王力宏", "祖峰"], "超时空同居": ["雷佳音", "王力宏", "佟丽娅"]}

keys = reduce(or_, + list(map(set, actor_of_movies.values())))

result = {k:[] for k in keys}

for k, v in actor_of_movies.items():
        for i in set(v):
                result.append(k)

print(result)

秋灯烬 发表于 2022-3-23 10:08:54

isdkz 发表于 2022-3-23 10:06


感谢大佬啊,我去研究一下,大佬真是什么都会啊{:9_227:}

大马强 发表于 2022-3-23 10:12:58

actor_of_movies = {"妖猫传": ["黄轩", "染谷将太", "黄轩"], "无问东西": [
    "章子怡", "王力宏", "祖峰"], "超时空同居": ["雷佳音", "王力宏", "佟丽娅"]}
movie_of_actor = {}
movie_list = []# 存放演员的出演的电影
for movie in actor_of_movies:
    # print(movie)
    for actor in actor_of_movies:
      if actor not in movie_of_actor:# 如果新列表没有这个演员,就先将这个演员和电影写入
            movie_list.append(movie)
            movie_of_actor = movie_list
            movie_list = []

      if movie not in movie_of_actor: # 如果新列表没有这个演员,看看是否是新的电影
            movie_of_actor.append(movie)
print(movie_of_actor)

isdkz 发表于 2022-3-23 10:14:43

秋灯烬 发表于 2022-3-23 10:08
感谢大佬啊,我去研究一下,大佬真是什么都会啊

不客气,{:5_109:},你搞懂那个的话你可以看看这个:

from functools import reduce
from operator import or_

actor_of_movies = {"妖猫传": ["黄轩", "染谷将太", "黄轩"], "无问东西": ["章子怡", "王力宏", "祖峰"], "超时空同居": ["雷佳音", "王力宏", "佟丽娅"]}

keys = reduce(or_, + list(map(set, actor_of_movies.values())))

result = {k: for k in keys}

print(result)

isdkz 发表于 2022-3-23 10:32:13


用 for 循环导出演员名也行,不用 reduce 和 or_ 来对集合求交集,这样可以按你的顺序,

用集合的话没法保证顺序:

actor_of_movies = {"妖猫传": ["黄轩", "染谷将太", "黄轩"], "无问东西": ["章子怡", "王力宏", "祖峰"], "超时空同居": ["雷佳音", "王力宏", "佟丽娅"]}

keys = []
for k, v in actor_of_movies.items():
        for i in v:
                if i not in keys:
                        keys.append(i)

result = {k: for k in keys}

print(result)

秋灯烬 发表于 2022-3-24 12:25:24

isdkz 发表于 2022-3-23 10:06


keys = reduce(or_, )

def or_(a, b):
    "Same as a | b."
    return a | b

大佬后面是一个列表里面有集合,他们都执行or_,or_我就不理解,后面我也不咋行啊,这是什么意思呢,
感觉有知识鸿沟啊,这个。

isdkz 发表于 2022-3-24 12:31:39

本帖最后由 isdkz 于 2022-3-24 12:32 编辑

秋灯烬 发表于 2022-3-24 12:25
keys = reduce(or_,

reduce 其实也可以手动给它传第一个值的,

keys = reduce(or_, ) 可以换成

keys = reduce(or_, [{'染谷将太', '黄轩'}, {'祖峰', '王力宏', '章子怡'}, {'雷佳音', '王力宏', '佟丽娅'}], set())

or_ 就是一个进行或运算的函数,集合的或运算就是求并集,

reduce 的用法你可以看一下这个:
https://python.iswbm.com/c05/c05_04.html

isdkz 发表于 2022-3-24 12:34:19

秋灯烬 发表于 2022-3-24 12:25
keys = reduce(or_,

我想知道你那个 or_ 的文档是怎么看的?

我用 help 显示的不是这样子,没有显示出 函数 完整的定义

秋灯烬 发表于 2022-3-24 15:50:16

isdkz 发表于 2022-3-24 12:34
我想知道你那个 or_ 的文档是怎么看的?

我用 help 显示的不是这样子,没有显示出 函数 完整的定义

用的是PyCharm,按了ctrl点一下or_就看到了。

isdkz 发表于 2022-3-24 15:51:29

秋灯烬 发表于 2022-3-24 15:50
用的是PyCharm,按了ctrl点一下or_就看到了。

好吧,谢谢{:5_109:}

秋灯烬 发表于 2022-3-24 17:06:05

isdkz 发表于 2022-3-24 15:51
好吧,谢谢

哪里哪里,我宇宙级大菜鸡{:9_227:}
页: [1]
查看完整版本: 困扰两天的关于键值互换的简单问题