鱼C论坛

 找回密码
 立即注册
查看: 1692|回复: 38

[已解决]随机交换字典里面的键值对,急急急

[复制链接]
发表于 2018-11-14 14:39:45 | 显示全部楼层 |阅读模式

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

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

x
OV ={
1: -7,
2: -3,
3:-3,
4: 0,
5:10,
6 : 6,
7: 3,
8: -5,
9: 0,
10: 0,
11: 9,
12:4,
13:-3,
14: -6,
15: 4,
16: -7,
17:-3,
18:4,
19:-7,
20: 4
}
随机交换键值对,比如1:-7与5:10,成对交换位置,结果应该是
OV ={
5:10,
2: -3,
3:-3,
4: 0,
1:-7,
6 : 6,
7: 3,
8: -5,
9: 0,
10: 0,
11: 9,
12:4,
13:-3,
14: -6,
15: 4,
16: -7,
17:-3,
18:4,
19:-7,
20: 4
}
最佳答案
2018-11-14 16:38:40
  1. from random import randint,sample
  2. station=[i for i in range(1,20)]
  3. demand=[-7,-3,-3,0,10,6,3,-5,0,0,9,4,-3,-6,4,-7,-3,4,-7,4]
  4. L=list(zip(station,demand))
  5. print(L)
  6. print('-'*40)
  7. length=len(L)

  8. def move1():
  9.     global L
  10.     a=randint(0,length-1)
  11.     temp=L[a]
  12.     L=L[:a]+L[a+1:]
  13.     b=randint(0,length-2)
  14.     L.insert(b,temp)

  15. def move2():
  16.     global L
  17.     a=randint(0,length-2)
  18.     temp=L[a:a+2]
  19.     L=L[:a]+L[a+2:]
  20.     b=randint(0,length-3)
  21.     L=L[:b]+temp+L[b:]

  22. def move3():
  23.     global L
  24.     a=randint(0,length-3)
  25.     temp=L[a:a+3]
  26.     L=L[:a]+L[a+3:]
  27.     b=randint(0,length-4)
  28.     L=L[:b]+temp+L[b:]

  29. def move4():
  30.     global L
  31.     while True:
  32.         a,b=sorted(sample(range(0,length-1),2))
  33.         if (b-a)!=1:
  34.             break
  35.     temp1=L[a]
  36.     temp2=L[b]
  37.     L=L[:a]+L[a+1:b]+L[b+1:]
  38.     c=randint(0,length-3)
  39.     L.insert(c,temp1)
  40.     d=randint(0,length-2)
  41.     L.insert(d,temp2)

  42. def move5():
  43.     global L
  44.     a,b=sorted(sample(range(0,length-1),2))
  45.     temp1=L[a]
  46.     temp2=L[b]
  47.     L=L[:a]+[L[b]]+L[a+1:b]+[L[a]]+L[b+1:]

  48.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-14 14:43:00 | 显示全部楼层
字典是无序的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 14:51:57 | 显示全部楼层
  1. from random import choice
  2. from itertools import combinations
  3. OV ={
  4. 1: -7,
  5. 2: -3,
  6. 3:-3,
  7. 4: 0,
  8. 5:10,
  9. 6 : 6,
  10. 7: 3,
  11. 8: -5,
  12. 9: 0,
  13. 10: 0,
  14. 11: 9,
  15. 12:4,
  16. 13:-3,
  17. 14: -6,
  18. 15: 4,
  19. 16: -7,
  20. 17:-3,
  21. 18:4,
  22. 19:-7,
  23. 20: 4
  24. }
  25. print(OV)
  26. print('-'*40)
  27. a=choice(list(combinations(OV.keys(),2)))
  28. OV[a[0]],OV[a[1]]=OV[a[1]],OV[a[0]]
  29. print(OV)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 14:53:27 | 显示全部楼层

字典的遍历是根据什么的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 14:59:23 | 显示全部楼层

这个程序只是随机交换了值,但是键没有交换到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 15:02:29 | 显示全部楼层
JeremyFeng 发表于 2018-11-14 14:59
这个程序只是随机交换了值,但是键没有交换到

嗯。字典是无序的,你这么修改顺序的意义是什么,访问还是按哈希值得到的放哪里又有什么关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 15:12:46 | 显示全部楼层
塔利班 发表于 2018-11-14 15:02
嗯。字典是无序的,你这么修改顺序的意义是什么,访问还是按哈希值得到的放哪里又有什么关系

这个程序只是我要做的东西的部分,key和value是固定搭配的,不能只修改一个,或者除了字典,还有其他方法实现吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 15:14:29 | 显示全部楼层
用列表呗,每个元素是原来字典的key,value二元组就行了
就实现了你所谓的有序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 15:17:07 | 显示全部楼层
塔利班 发表于 2018-11-14 15:14
用列表呗,每个元素是原来字典的key,value二元组就行了
就实现了你所谓的有序

可以帮敲一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 15:22:46 | 显示全部楼层
  1. from random import choice
  2. from itertools import combinations
  3. OV =[['a',1],['b',2],['c',3]]
  4. print(OV)
  5. print('-'*40)
  6. a=choice(list(combinations(OV,2)))
  7. a[0][1],a[1][1]=a[1][1],a[0][1]
  8. print(OV)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 15:53:30 | 显示全部楼层

我把我要做的东西发给你了,帮忙看一下,谢谢你

我要做的东西,大概是这样

我要做的东西,大概是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 16:09:58 | 显示全部楼层

字典,数组,链表,我不确定用哪一种方法做比较简单,一个station除了demand,还有坐标,需要进行计算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 16:11:22 | 显示全部楼层
嗯,我上面的好像还是换值,你要的是值和键绑定,对其进行更换吧
你刚才问的是最后一项?还是都做了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 16:24:02 | 显示全部楼层
塔利班 发表于 2018-11-14 16:11
嗯,我上面的好像还是换值,你要的是值和键绑定,对其进行更换吧
你刚才问的是最后一项?还是都做了?

我上传了一个附件,其实是每一个station,demand,坐标是绑定在一起的,是一个局部搜索,寻找最短路径
给定一个系列,将这个序列打乱,寻找最优解
我之前用链表试了一下,感觉行不通,现在完整的一项都还没有做完呢,好慌
请大神请教

11.txt

366 Bytes, 下载次数: 0

数据

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 16:38:40 | 显示全部楼层    本楼为最佳答案   
  1. from random import randint,sample
  2. station=[i for i in range(1,20)]
  3. demand=[-7,-3,-3,0,10,6,3,-5,0,0,9,4,-3,-6,4,-7,-3,4,-7,4]
  4. L=list(zip(station,demand))
  5. print(L)
  6. print('-'*40)
  7. length=len(L)

  8. def move1():
  9.     global L
  10.     a=randint(0,length-1)
  11.     temp=L[a]
  12.     L=L[:a]+L[a+1:]
  13.     b=randint(0,length-2)
  14.     L.insert(b,temp)

  15. def move2():
  16.     global L
  17.     a=randint(0,length-2)
  18.     temp=L[a:a+2]
  19.     L=L[:a]+L[a+2:]
  20.     b=randint(0,length-3)
  21.     L=L[:b]+temp+L[b:]

  22. def move3():
  23.     global L
  24.     a=randint(0,length-3)
  25.     temp=L[a:a+3]
  26.     L=L[:a]+L[a+3:]
  27.     b=randint(0,length-4)
  28.     L=L[:b]+temp+L[b:]

  29. def move4():
  30.     global L
  31.     while True:
  32.         a,b=sorted(sample(range(0,length-1),2))
  33.         if (b-a)!=1:
  34.             break
  35.     temp1=L[a]
  36.     temp2=L[b]
  37.     L=L[:a]+L[a+1:b]+L[b+1:]
  38.     c=randint(0,length-3)
  39.     L.insert(c,temp1)
  40.     d=randint(0,length-2)
  41.     L.insert(d,temp2)

  42. def move5():
  43.     global L
  44.     a,b=sorted(sample(range(0,length-1),2))
  45.     temp1=L[a]
  46.     temp2=L[b]
  47.     L=L[:a]+[L[b]]+L[a+1:b]+[L[a]]+L[b+1:]

  48.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-15 13:59:45 | 显示全部楼层
有一种字典可以有序,就是OrderDict类
你可以:
from collections import OrderDict
你可以查询一下它的用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-16 11:02:38 | 显示全部楼层

好的,谢谢,再帮我看一下这个,图片里面的的操作,要怎么敲

再帮我看一下这个

再帮我看一下这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-16 11:04:09 | 显示全部楼层
喜欢吃菠菜 发表于 2018-11-15 13:59
有一种字典可以有序,就是OrderDict类
你可以:
from collections import OrderDict

好的,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-16 11:17:50 | 显示全部楼层
第一个
  1. from random import randint
  2. demand=[i for i in range(1,21)]
  3. print(demand)
  4. print('-'*40)
  5. def ins(x):
  6.     l=len(demand)
  7.     if x in demand:
  8.         t=randint(0,l-1)
  9.         demand.insert(t,x)
  10.     else:
  11.         for i in range(2):
  12.             t=randint(0,l-1+i)
  13.             demand.insert(t,x)
  14. ins(3)
  15. #ins(33)
  16. print(demand)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-16 11:41:16 | 显示全部楼层
第二个,你说的切割要每个单元不能为空吧
  1. from random import randint,shuffle
  2. L=[0,8,7,9,5,6,4,1,2,3,0]
  3. print(L)
  4. print('----------cut----------')
  5. l=len(L)
  6. t=[]
  7. for i in range(4):
  8.     l=len(L)
  9.     a=randint(1,l-4+i+1)
  10.     if i==3:
  11.         t.append(L)
  12.     else:
  13.         t.append(L[:a])
  14.     L=L[a:]
  15. L=[]
  16. print(*t)
  17. print('----------reunion----------')
  18. shuffle(t)
  19. for each in t:
  20.     L+=each
  21. print(L)
  22.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 01:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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