|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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]]
- def func(d):
- # 对原子典进行拷贝,并赋值给 d,如果注释掉下面这行代码,则原子典可能会被改变
- d = d.copy()
- # 初始化一个空列表 result,用于存放结果
- result = []
- # for 循环遍历字典的键-值对,由于下面涉及到对字典的键进行删除,所以这里遍历的是字典 d 的拷贝,如果不拷贝会报错
- for k, v in d.copy().items():
- # 创建一个列表 temp,temp 的第一个元素为当前遍历的键
- temp = [k]
- # 下面用 while 循环查找符合条件的循环
- while True:
- # 如果 v(也就是值)在列表 temp 中,但不是 temp 的第一个元素,说明本轮的键-值对在原子典中不存在循环
- # break 中止当前的 while 循环,继续遍历下一个键-值对
- if v in temp and v != temp[0]:
- break
- # 如果 v(也就是值)是列表 temp 的第一个元素,说明已经找到符合条件的一组循环,将 temp 添加至结果列表 result 中
- # 下面的 for 循环是用来删除字典 d 中相应的键,如果不删除,最终的结果会多出一些“重复”的情况
- # break 中止当前的 while 循环,继续遍历下一个键-值对
- elif v == temp[0]:
- result.append(temp)
- for k in temp:
- d.pop(k)
- break
- # 如果 v(也就是值)是字典 d 的键,则将其添加至列表 temp 中,并以 v 为键,取出对应的值,赋值给 v
- # continue 继续 while 循环
- elif v in d.keys():
- temp.append(v)
- v = d[v]
- continue
- # 其他情况,直接 break 中止当前的 while 循环,继续遍历下一个键-值对
- else:
- break
- return result
- if __name__ == "__main__":
- d1 = {1: 5, 2: 6, 3: 5, 4: 5, 5: 6, 6: 7, 7: 1, 9: 6, 10: 10}
- d2 = {2: 7, 3: 11, 4: 10, 5: 10, 7: 2, 9: 5, 10: 10, 11: 5}
- print(func(d1))
- print(func(d2))
复制代码
|
|