鱼C论坛

 找回密码
 立即注册
查看: 1943|回复: 17

关于列表赋值的一些问题

[复制链接]
发表于 2017-2-16 15:18:01 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 凌云裂空 于 2017-2-16 15:42 编辑

问题:为啥我按照如下方式给列表赋值不可以呢?

  1. for i in range(1,dimension+1):
  2.     for j in range(1,dimension+1):
  3.         dist[i][j][0]=Gmap[i][j]
复制代码


这是从下面完整代码中抠出来的一段,是从第67到第69行

dist在这之前已经是一个元素全为0的22*22*22的列表

Gmap在第24到第55行被赋值

为什么第69行的赋值不可行呢?

谢谢贴吧大神解惑!

更详细的代码和文字描述在下面:







完整代码如下:
  1. ##################################################################
  2. #                       Floyd-Warshall算法         
  3. ##################################################################

  4. #作者:张阔翔
  5. #学号:2120160114
  6. #环境:python3.6

  7. ##################################################################

  8. ##########
  9. # 初始化
  10. ##########
  11. Inf = 10000
  12. n = 0
  13. i = 1
  14. temp = [0]
  15. element_in_line = []
  16. dimension = 0
  17. ############################
  18. #      建立路径map关系
  19. ############################
  20. # 读取txt数据
  21. file = open('第3次作业Floyd-Warshall数据.txt','r')

  22. # 判断维数
  23. for each_line in file:
  24.     n = n + 1
  25. dimension = n

  26. # 创建Gmap
  27. Gmap = [[0] * (dimension + 1)]

  28. # 文件指针归零
  29. file.seek(0,0)
  30.    
  31. # 把字符串格式转换为整型
  32. for each_line in file:
  33.     element_in_line = each_line.split()
  34.     if(i == 1):
  35.         element_in_line.remove('A')
  36.         element_in_line.remove('=[')
  37.     if(i == dimension):
  38.         element_in_line.remove('];')
  39.     for j in range(1,dimension+1):
  40.         if(element_in_line[j-1] == 'Inf'):
  41.             temp.append(Inf)
  42.         else:
  43.             temp.append(int(element_in_line[j-1]))
  44.                
  45.     i = i + 1      
  46.     Gmap.append(temp)
  47.     temp = [0]
  48.    
  49. file.close()

  50. print(Gmap)
  51.    
  52. ###############################################
  53. # 建立一个三维列表,维数为dimension,元素全部为0
  54. ###############################################
  55. dist = [[[0] * (dimension + 1)] * (dimension+1)] * (dimension+1)

  56. ####################################
  57. # Floyd-Warshall Dynamic Programming      
  58. ####################################
  59. for i in range(1,dimension+1):
  60.     for j in range(1,dimension+1):
  61.         dist[i][j][0]=Gmap[i][j]
  62.         
  63. print(dist)

  64. for k in range(1,dimension+1):
  65.     for i in range(1,dimension+1):
  66.         for j in range(1,dimension+1):
  67.             dist[i][j][k] = dist[i][j][k-1]
  68.             if(dist[i][k][k-1] + dist[k][j][k-1] < dist[i][j][k]):
  69.                 dist[i][j][k] = dist[i][k][k-1] + dist[k][j][k-1]

  70. ############################
  71. #         主程序
  72. ############################
  73. u = int(input('起始点:'))
  74. v = int(input('终止点:'))

  75. for k in range(dimension+1):
  76.     if(dist[u][v][k] == Inf):
  77.        print('Inf')
  78.     else:
  79.        print(dist[u][v][k])
复制代码


万能的论坛大神们:

        求助,以上代码是关于Floyd-Warshall算法的实现。先暂时抛开Floyd-Warshall算法本身不谈,关于python代码我遇到了一些问题,麻烦论坛前辈们指教。

        现在的问题是,第69行,我的目的是把Gmap列表的元素赋值给dist列表。从57行的print语句的结果中可以知道,Gmap是成功被赋值的,但是从第71行语句的结果来看,dist在赋值过后依然还是一个22*22*22的元素全为0的列表。也就是说,应该是69行这附近出了问题。

        所以我想问我的代码是哪里出了问题呢?为什么赋值不上去呢?另外应该如何改正呢?

        “第3次作业Floyd-Warshall数据.txt”这个文件我上传到附录了,可以下载一下,与代码放在一个根目录下即可。

        非常感激各位好心人!祝生活愉快!

        ps:关于我写的Floyd-Warshall算法本身的逻辑似乎还有点问题,不过这不是重点,可以先暂时忽略,等过后我会自行调整。

第3次作业Floyd-Warshall数据.zip

487 Bytes, 下载次数: 2

最佳答案

查看完整内容

把你的程序再简化一下,你看看差别。(这里我用pprint,为了更好的显示)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-16 15:18:02 | 显示全部楼层
凌云裂空 发表于 2017-2-16 15:47
我认为出了问题的代码就在下面这几行之中:

把你的程序再简化一下,你看看差别。(这里我用pprint,为了更好的显示)

  1. from pprint import pprint
  2. dimension = 3
  3. dist = [[[0] * (dimension + 1)] * (dimension+1)] * (dimension+1)
  4. for i in range(1, dimension+1):
  5.     for j in range(1, dimension+1):
  6.         dist[i][j][0]=i * j
  7. pprint(dist)
复制代码

  1. [[[9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0]],
  2. [[9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0]],
  3. [[9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0]],
  4. [[9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0], [9, 0, 0, 0]]]
复制代码

  1. from pprint import pprint
  2. dimension = 3
  3. dist = [[[0 for i in range(dimension + 1)] for j in range(dimension + 1)] for k in range(dimension + 1)]
  4. for i in range(1, dimension+1):
  5.     for j in range(1, dimension+1):
  6.         dist[i][j][0]=i * j
  7. pprint(dist)
复制代码

  1. [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
  2. [[0, 0, 0, 0], [1, 0, 0, 0], [2, 0, 0, 0], [3, 0, 0, 0]],
  3. [[0, 0, 0, 0], [2, 0, 0, 0], [4, 0, 0, 0], [6, 0, 0, 0]],
  4. [[0, 0, 0, 0], [3, 0, 0, 0], [6, 0, 0, 0], [9, 0, 0, 0]]]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
凌云裂空 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

发表于 2017-2-16 15:28:05 | 显示全部楼层
你把69行改为如下试试。
  1. dist = [[[0 for i in range(dimension + 1)] for j in range(dimension + 1)] for k in range(dimension + 1)]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 15:36:05 | 显示全部楼层
冬雪雪冬 发表于 2017-2-16 15:28
你把69行改为如下试试。

依然是全零的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 15:38:34 | 显示全部楼层
冬雪雪冬 发表于 2017-2-16 15:28
你把69行改为如下试试。

不好意思,但我看您这句本身不就是给dist赋值为全零吗?但我是想在第69行把Gmap的元素赋值给dist。

祝生活愉快!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-16 15:41:52 | 显示全部楼层
凌云裂空 发表于 2017-2-16 15:38
不好意思,但我看您这句本身不就是给dist赋值为全零吗?但我是想在第69行把Gmap的元素赋值给dist。
{:9_ ...

这样吧,你把程序简化一下,只把你认为有问题的部分独立出来,我再看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 15:42:54 | 显示全部楼层
冬雪雪冬 发表于 2017-2-16 15:41
这样吧,你把程序简化一下,只把你认为有问题的部分独立出来,我再看看。

好,麻烦稍等,谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-16 15:44:14 | 显示全部楼层
本帖最后由 余欲渔 于 2017-2-16 15:51 编辑

发错了,看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 15:47:51 | 显示全部楼层
冬雪雪冬 发表于 2017-2-16 15:41
这样吧,你把程序简化一下,只把你认为有问题的部分独立出来,我再看看。

我认为出了问题的代码就在下面这几行之中:

  1. ###############################################
  2. # 建立一个三维列表,维数为dimension,元素全部为0
  3. ###############################################
  4. dist = [[[0] * (dimension + 1)] * (dimension+1)] * (dimension+1)

  5. ####################################
  6. # Floyd-Warshall Dynamic Programming      
  7. ####################################
  8. for i in range(1,dimension+1):
  9.     for j in range(1,dimension+1):
  10.         dist[i][j][0]=Gmap[i][j]
  11.         
  12. print(dist)
复制代码


麻烦您看一下,有问题没有呢?

其中Gmap列表已经在这段代码的前面赋值过了,您可以从上面的完整代码的第24到第55行中找到,这部分我已经验证过了,是没问题的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 15:51:38 | 显示全部楼层
余欲渔 发表于 2017-2-16 15:44
第52行有问题吧,
32行换成Gmap = [[] * (dimension + 1)]
52行换成:Gmap.append(temp)

不好意思,但是我的目的就是想让Gmap的第一行和第一列都为零,如果用您的方法,第一行就不是0了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 15:53:18 | 显示全部楼层

同样感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 15:55:26 | 显示全部楼层
冬雪雪冬 发表于 2017-2-16 15:41
这样吧,你把程序简化一下,只把你认为有问题的部分独立出来,我再看看。

我的程序是参考这个上面的改过来的:http://www.cppblog.com/mythit/archive/2009/04/21/80579.aspx
您可以看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-16 16:05:20 | 显示全部楼层
把整个题目发出来,理理思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 16:13:26 | 显示全部楼层
余欲渔 发表于 2017-2-16 16:05
把整个题目发出来,理理思路

题目本身涉及到动态规划问题:
如图:
我参考的是:http://www.cppblog.com/mythit/archive/2009/04/21/80579.aspx
捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-16 16:38:09 | 显示全部楼层
冬雪雪冬 发表于 2017-2-16 16:24
把你的程序再简化一下,你看看差别。(这里我用pprint,为了更好的显示)

谢谢啦!有点蒙
我先考虑一下哈
万分感谢,有问题可能还要叨扰您哈
祝生活愉快!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-16 16:48:38 | 显示全部楼层
凌云裂空 发表于 2017-2-16 16:38
谢谢啦!有点蒙
我先考虑一下哈
万分感谢,有问题可能还要叨扰您哈

不客气,我也再想想。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-18 10:41:26 | 显示全部楼层
。。北理要学python吗。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-18 10:48:45 | 显示全部楼层
^ambition 发表于 2017-2-18 10:41
。。北理要学python吗。。

嘿嘿,技多不压身嘛,还是挺憧憬IT行业的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 16:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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