• python enumerate ,range下标迭代


    python enumerate ,range下标迭代list区别---------注意大坑

    一般除了写法没什么差别;如果迭代可变对象,迭代过程有增删,那要小心了。

    for i,v in enumerate(Li_d) , 下标 i会从0 逐渐+1 直到 i=当前的长度-1 ;for item in Li_d 也是会动态的往后迭代Li_d

    如果长度发生变化,就会产生意想不到的结果。

    for i in range(len(Li_d)) , 下标 i会从0 逐渐+1 直到 i=初始长度-1
    • eg1:中途判断,pop了一项,后面的项下标都会 -1,导致后面的操作就会都漏掉填补过来的下一项

      In [114]: Li_d = [{str(x): x**2} for x in range(5)]
           ...: Li_d
           ...:
      Out[114]: [{'0': 0}, {'1': 1}, {'2': 4}, {'3': 9}, {'4': 16}]> 
      In [115]: for i, x in enumerate(Li_d):
           ...:     print i ,len(Li_d)
           ...:     if '1' in x:
           ...:         Li_d.pop(i)
           ...:     else:
           ...:         x['k'] = 5+i
           ...:
           ...:     x['j'] = 0
           ...: Li_d
           ...:
      0 5
      1 5
      2 4
      3 4
      Out[115]:
      [{'0': 0, 'j': 0, 'k': 5},
       {'2': 4},
       {'3': 9, 'j': 0, 'k': 7},
       {'4': 16, 'j': 0, 'k': 8}]
      
      In [116]:
      
    • eg2:尾部添加 append。后面的操作对 新加进来的 项 也会操作

      In [117]: Li_d = [{str(x): x**2} for x in range(5)]
           ...: Li_d
           ...:
      Out[117]: [{'0': 0}, {'1': 1}, {'2': 4}, {'3': 9}, {'4': 16}]
      
      In [118]: for i, x in enumerate(Li_d):
           ...:     print i ,len(Li_d)
           ...:     if '1' in x:
           ...:         Li_d.append({'0-*':0})
           ...:     else:
           ...:         x['k'] = 5+i
           ...:     x['j'] = 0
           ...:
           ...: Li_d
           ...:
      0 5
      1 5
      2 6
      3 6
      4 6
      5 6
      Out[118]:
      [{'0': 0, 'j': 0, 'k': 5},
       {'1': 1, 'j': 0},
       {'2': 4, 'j': 0, 'k': 7},
       {'3': 9, 'j': 0, 'k': 8},
       {'4': 16, 'j': 0, 'k': 9},
       {'0-*': 0, 'j': 0, 'k': 10}]
      
    • eg3 头部插入,或者当前元素插入,会导致 重复无限判断

      Li_d = [{str(x): x**2} for x in range(5)]
      print (Li_d)
      for i, x in enumerate(Li_d):
          print (i ,len(Li_d))
          if '1' in x:
              Li_d.insert(i,{'0-*':0})
          else:
              x['k'] = 5+i
          x['j'] = 0
      
      Li_d
      ..................无限迭代,试试?
      

    for i in range(len(Li_d)) 这样的写法,不会随着长度变化而往后迭代

    • #python2, python3也一样 python3 //range 默认惰性的 xrange
      In [3]: Li_d = [{str(x): x**2} for x in range(5)]
         ...:
         ...: print(Li_d)
         ...: for i in xrange(len(Li_d)):
         ...:     print(i ,len(Li_d))
         ...:     x = Li_d[i]
         ...:     if '1' in x:
         ...:         Li_d.insert(0,{'0-*':0})
         ...:     else:
         ...:         x['k'] = 5+i
         ...:     x['j'] = 0
         ...:
         ...: Li_d
         ...:
      [{'0': 0}, {'1': 1}, {'2': 4}, {'3': 9}, {'4': 16}]
      (0, 5)
      (1, 5)
      (2, 6)
      (3, 7)
      (4, 8)
      Out[3]:
      [{'0-*': 0},
       {'0-*': 0},
       {'0-*': 0},
       {'0-*': 0},
       {'0': 0, 'j': 0, 'k': 5},
       {'1': 1, 'j': 0},
       {'2': 4},
       {'3': 9},
       {'4': 16}]
      
      In [4]:
      

    迭代过程中,如果有增删操作,最好不要和其他操作放在一起,以免结果不确定

  • 相关阅读:
    (转)CortexM3 (NXP LPC1788)之IIS控制器
    (转)ARMThumb 过程调用标准
    (转)CortexM3 (NXP LPC1788)之看门狗定时器对Flash编程的影响
    (转)CortexM3 (NXP LPC1788)之ADC数模转换器的应用
    (笔记)电路设计(一)之上拉电阻与下拉电阻的应用
    (转)CortexM3 (NXP LPC1788)之EEPROM存储器
    (转)CortexM3 (NXP LPC1788)之IIS应用UDA1380进行音频数据播放
    (转)CortexM3 (NXP LPC1788)之WDT窗口看门狗定时器
    (转)CortexM3 (NXP LPC1788)之SDRAM操作
    (转)CortexM3 (NXP LPC1788)之IIC应用PCA9532进行IO扩展和LED亮度控制
  • 原文地址:https://www.cnblogs.com/willowj/p/8075286.html
Copyright © 2020-2023  润新知