鱼C论坛

 找回密码
 立即注册
查看: 1976|回复: 3

[已解决]在字典中如何找出循环

[复制链接]
发表于 2019-6-14 17:34:15 | 显示全部楼层 |阅读模式

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

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

x
请问以下问题如何解决?

已知一个字典  dict = {1: 5, 2: 6, 3: 5, 4: 5, 5: 6, 6: 7, 7: 1, 9: 6,10:10}
这里的话,例如 1:5 5:6 6:7 7:1 是一个循环,10:10自己也是一个循环。

这要如何实现得出一个列表  l = [ [1,5,6,7] , [10] ] 呢?

或者字典 {2: 7, 3: 11, 4: 10, 5: 10, 7: 2, 9: 5, 10: 10, 11: 5} 中的循环 2:7, 7:2 和 10:10 得出列表 [[2,7],[10]]
最佳答案
2019-6-14 21:09:39
  1. def func(d):
  2.     # 对原子典进行拷贝,并赋值给 d,如果注释掉下面这行代码,则原子典可能会被改变
  3.     d = d.copy()
  4.     # 初始化一个空列表 result,用于存放结果
  5.     result = []
  6.     # for 循环遍历字典的键-值对,由于下面涉及到对字典的键进行删除,所以这里遍历的是字典 d 的拷贝,如果不拷贝会报错
  7.     for k, v in d.copy().items():
  8.         # 创建一个列表 temp,temp 的第一个元素为当前遍历的键
  9.         temp = [k]
  10.         # 下面用 while 循环查找符合条件的循环
  11.         while True:
  12.             # 如果 v(也就是值)在列表 temp 中,但不是 temp 的第一个元素,说明本轮的键-值对在原子典中不存在循环
  13.             # break 中止当前的 while 循环,继续遍历下一个键-值对
  14.             if v in temp and v != temp[0]:
  15.                 break
  16.             # 如果 v(也就是值)是列表 temp 的第一个元素,说明已经找到符合条件的一组循环,将 temp 添加至结果列表 result 中
  17.             # 下面的 for 循环是用来删除字典 d 中相应的键,如果不删除,最终的结果会多出一些“重复”的情况
  18.             # break 中止当前的 while 循环,继续遍历下一个键-值对
  19.             elif v == temp[0]:
  20.                 result.append(temp)
  21.                 for k in temp:
  22.                     d.pop(k)
  23.                 break
  24.             # 如果 v(也就是值)是字典 d 的键,则将其添加至列表 temp 中,并以 v 为键,取出对应的值,赋值给 v
  25.             # continue 继续 while 循环
  26.             elif v in d.keys():
  27.                 temp.append(v)
  28.                 v = d[v]
  29.                 continue
  30.             # 其他情况,直接 break 中止当前的 while 循环,继续遍历下一个键-值对
  31.             else:
  32.                 break

  33.     return result


  34. if __name__ == "__main__":
  35.     d1 = {1: 5, 2: 6, 3: 5, 4: 5, 5: 6, 6: 7, 7: 1, 9: 6, 10: 10}
  36.     d2 = {2: 7, 3: 11, 4: 10, 5: 10, 7: 2, 9: 5, 10: 10, 11: 5}
  37.     print(func(d1))
  38.     print(func(d2))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-14 18:34:22 | 显示全部楼层
不知道你想说什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-14 21:09:39 | 显示全部楼层    本楼为最佳答案   
  1. def func(d):
  2.     # 对原子典进行拷贝,并赋值给 d,如果注释掉下面这行代码,则原子典可能会被改变
  3.     d = d.copy()
  4.     # 初始化一个空列表 result,用于存放结果
  5.     result = []
  6.     # for 循环遍历字典的键-值对,由于下面涉及到对字典的键进行删除,所以这里遍历的是字典 d 的拷贝,如果不拷贝会报错
  7.     for k, v in d.copy().items():
  8.         # 创建一个列表 temp,temp 的第一个元素为当前遍历的键
  9.         temp = [k]
  10.         # 下面用 while 循环查找符合条件的循环
  11.         while True:
  12.             # 如果 v(也就是值)在列表 temp 中,但不是 temp 的第一个元素,说明本轮的键-值对在原子典中不存在循环
  13.             # break 中止当前的 while 循环,继续遍历下一个键-值对
  14.             if v in temp and v != temp[0]:
  15.                 break
  16.             # 如果 v(也就是值)是列表 temp 的第一个元素,说明已经找到符合条件的一组循环,将 temp 添加至结果列表 result 中
  17.             # 下面的 for 循环是用来删除字典 d 中相应的键,如果不删除,最终的结果会多出一些“重复”的情况
  18.             # break 中止当前的 while 循环,继续遍历下一个键-值对
  19.             elif v == temp[0]:
  20.                 result.append(temp)
  21.                 for k in temp:
  22.                     d.pop(k)
  23.                 break
  24.             # 如果 v(也就是值)是字典 d 的键,则将其添加至列表 temp 中,并以 v 为键,取出对应的值,赋值给 v
  25.             # continue 继续 while 循环
  26.             elif v in d.keys():
  27.                 temp.append(v)
  28.                 v = d[v]
  29.                 continue
  30.             # 其他情况,直接 break 中止当前的 while 循环,继续遍历下一个键-值对
  31.             else:
  32.                 break

  33.     return result


  34. if __name__ == "__main__":
  35.     d1 = {1: 5, 2: 6, 3: 5, 4: 5, 5: 6, 6: 7, 7: 1, 9: 6, 10: 10}
  36.     d2 = {2: 7, 3: 11, 4: 10, 5: 10, 7: 2, 9: 5, 10: 10, 11: 5}
  37.     print(func(d1))
  38.     print(func(d2))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-29 16:06:31 | 显示全部楼层
还有别的方式实现吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 04:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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