Chinaunix

标题: 列表中套列表的python问题 [打印本页]

作者: Panyway    时间: 2016-01-10 21:19
标题: 列表中套列表的python问题
我在实际编程中遇到这样的情况:
有list a, 假设
i=1, a=[1,2,3]
i=2,a=[[1,2,3],[4,5,6],[7,8,9]]
i=3,a=[[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[16,17,18]],[[19,20,21],[22,23,24],[25,26,27]]]
…………
如果我做一个for循环,假设每次都取最里边的第一个元素。循环变量i=1时,取a中元素我用b[0];
i=2, b[0][0];
i=3,b[0][0][0]
…………
问题:我现在知道了取不同i的时候逻辑上怎么取数据,但是编程上怎么实现,有没有简便的方法?
作者: zhonghua7896321    时间: 2016-01-11 13:53
本帖最后由 zhonghua7896321 于 2016-01-11 13:55 编辑

b = "a"
for j in xrange(i):
     b += "[0]"
eval(b)     

作者: reyleon    时间: 2016-01-11 15:48
  1. #!/usr/bin/python
  2. # -*- coding:utf8 -*-

  3. a=[[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[16,17,18]],[[19,20,21],[22,23,24],[25,26,27]]]

  4. temp = a[:]
  5. c = 1
  6. n = 3 # 层级
  7. while True:
  8.     try:temp = temp[0]
  9.     except Exception:pass
  10.     if c >= n:
  11.         break
  12.     c+=1

  13. print temp
复制代码

作者: Panyway    时间: 2016-01-11 17:11
回复 2# zhonghua7896321
多谢,果然需要exec和eval这些用法


   
作者: Panyway    时间: 2016-01-11 17:24
回复 3# reyleon
这种写法也很优美,多谢!

   
作者: Panyway    时间: 2016-01-12 09:39
回复 3# reyleon
还有个问题也想请教下,如果在一个循环中,需要根据变量i定义内层循环的层数,比如for i in range(5), i=1,里面还有一层循环;i=2,里面还有两层循环;......
这种情况下怎么写呢?
   
作者: reyleon    时间: 2016-01-12 09:43
回复 6# Panyway


    不明白你说的意思
作者: Panyway    时间: 2016-01-12 10:45
回复 7# reyleon
比如说最外层有循环语句:
for i in range(5):
在这个循环中我要根据变量i写代码,这些代码也是循环,若:
i=1,代码为一层循环
for j in range(3):
    ......
若i=2,代码为两层循环
for j in range(3):
    for k in range(3):
        ......
......
......
若i=5,代码为五层循环
for j in range(3):
    for k in range(3):
        for l in range(3):
            for m in range(3):
                for n in range(3):
                    ......
依次类推,该怎么写呢?

   
作者: zhonghua7896321    时间: 2016-01-12 11:15
回复 8# Panyway

--------------------------------------------------------------------------------------------------
实现代码
--------------------------------------------------------------------------------------------------
  1. a = 'test.py'
  2. with open(a, 'a+') as f:
  3.     for i in range(1,6):
  4.         j = ''
  5.         t = ''
  6.         c = '# current i value is : %d\n' % i
  7.         f.write(c)
  8.         for _ in range(i):
  9.             j += 'j'
  10.             t += '    '
  11.             str = "%sfor %s in range(3):\n" % (t, j)
  12.             f.write(str)
  13.         f.write("\n#===========================\n")

  14. # call the test.py file ...



  15. --------------------------------------------------------------------------------------------------
  16. 下边是生成的test.py文件
  17. --------------------------------------------------------------------------------------------------
  18. # current i value is : 1
  19.     for j in range(3):

  20. #===========================
  21. # current i value is : 2
  22.     for j in range(3):
  23.         for jj in range(3):

  24. #===========================
  25. # current i value is : 3
  26.     for j in range(3):
  27.         for jj in range(3):
  28.             for jjj in range(3):

  29. #===========================
  30. # current i value is : 4
  31.     for j in range(3):
  32.         for jj in range(3):
  33.             for jjj in range(3):
  34.                 for jjjj in range(3):

  35. #===========================
  36. # current i value is : 5
  37.     for j in range(3):
  38.         for jj in range(3):
  39.             for jjj in range(3):
  40.                 for jjjj in range(3):
  41.                     for jjjjj in range(3):

  42. #===========================
复制代码

作者: Panyway    时间: 2016-01-12 11:39
回复 9# zhonghua7896321
多谢大神回复!看来只能动态生成了,如果有种语法能定义循环的层数就好了。


   
作者: reyleon    时间: 2016-01-12 11:44
回复 8# Panyway


    http://bbs.chinaunix.net/thread-4118053-1-1.html
作者: reyleon    时间: 2016-01-12 11:45
你到底要干嘛?
作者: Panyway    时间: 2016-01-12 13:53
回复 12# reyleon
不好意思,我要写一个分形算法,因为不想让别人代劳,就尝试自己去完成。写的过程中遇到最早提出的那个问题,后来发现用第二个问题提到的方法更容易解决,所以问了两次。
原始问题为:有三个点,组成等边三角形,要进行迭代,每次计算出组成三角形三边的中点,最后用pylab画出。


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2