鱼C论坛

 找回密码
 立即注册
查看: 2004|回复: 11

[已解决]困扰两天的关于键值互换的简单问题

[复制链接]
发表于 2022-3-23 09:44:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

这是我的一个字典

我要把他转化成

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

这样子,也就是演员对应的电影,但是苦于只学了几天Python,写不出来,又被什么哈西值困扰,有没有大佬能帮帮我,我看一下没准就懂了。
最佳答案
2022-3-23 10:06:03
  1. from functools import reduce
  2. from operator import or_

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

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

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

  6. for k, v in actor_of_movies.items():
  7.         for i in set(v):
  8.                 result[i].append(k)

  9. print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-23 10:06:03 | 显示全部楼层    本楼为最佳答案   
  1. from functools import reduce
  2. from operator import or_

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

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

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

  6. for k, v in actor_of_movies.items():
  7.         for i in set(v):
  8.                 result[i].append(k)

  9. print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-23 10:08:54 | 显示全部楼层

感谢大佬啊,我去研究一下,大佬真是什么都会啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-23 10:12:58 | 显示全部楼层
  1. actor_of_movies = {"妖猫传": ["黄轩", "染谷将太", "黄轩"], "无问东西": [
  2.     "章子怡", "王力宏", "祖峰"], "超时空同居": ["雷佳音", "王力宏", "佟丽娅"]}
  3. movie_of_actor = {}
  4. movie_list = []  # 存放演员的出演的电影
  5. for movie in actor_of_movies:
  6.     # print(movie)
  7.     for actor in actor_of_movies[movie]:
  8.         if actor not in movie_of_actor:  # 如果新列表没有这个演员,就先将这个演员和电影写入
  9.             movie_list.append(movie)
  10.             movie_of_actor[actor] = movie_list
  11.             movie_list = []

  12.         if movie not in movie_of_actor[actor]: # 如果新列表没有这个演员,看看是否是新的电影
  13.             movie_of_actor[actor].append(movie)
  14. print(movie_of_actor)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-23 10:14:43 | 显示全部楼层
秋灯烬 发表于 2022-3-23 10:08
感谢大佬啊,我去研究一下,大佬真是什么都会啊

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

  1. from functools import reduce
  2. from operator import or_

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

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

  5. result = {k:[movie for movie, actor in actor_of_movies.items() if k in actor] for k in keys}

  6. print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-23 10:32:13 | 显示全部楼层

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

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

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

  2. keys = []
  3. for k, v in actor_of_movies.items():
  4.         for i in v:
  5.                 if i not in keys:
  6.                         keys.append(i)

  7. result = {k:[movie for movie, actor in actor_of_movies.items() if k in actor] for k in keys}

  8. print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-24 12:25:24 | 显示全部楼层

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

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

大佬后面是一个列表里面有集合,他们都执行or_,or_我就不理解,后面我也不咋行啊,这是什么意思呢,
感觉有知识鸿沟啊,这个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-24 12:31:39 | 显示全部楼层
本帖最后由 isdkz 于 2022-3-24 12:32 编辑
秋灯烬 发表于 2022-3-24 12:25
keys = reduce(or_, [set(), {'染谷将太', '黄轩'}, {'祖峰', '王力宏', '章子怡'}, {'雷佳音', '王力宏' ...


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

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

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


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

reduce 的用法你可以看一下这个:
https://python.iswbm.com/c05/c05_04.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-24 12:34:19 | 显示全部楼层
秋灯烬 发表于 2022-3-24 12:25
keys = reduce(or_, [set(), {'染谷将太', '黄轩'}, {'祖峰', '王力宏', '章子怡'}, {'雷佳音', '王力宏' ...

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

我用 help 显示的不是这样子,没有显示出 函数 完整的定义
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-24 15:50:16 | 显示全部楼层
isdkz 发表于 2022-3-24 12:34
我想知道你那个 or_ 的文档是怎么看的?

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

用的是PyCharm,按了ctrl点一下or_就看到了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-24 15:51:29 | 显示全部楼层
秋灯烬 发表于 2022-3-24 15:50
用的是PyCharm,按了ctrl点一下or_就看到了。

好吧,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-24 17:06:05 | 显示全部楼层

哪里哪里,我宇宙级大菜鸡
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 16:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表