【问题标题】:Edit the value of every Nth item in a list编辑列表中每 N 个项目的值
【发布时间】:2016-06-30 21:42:26
【问题描述】:

对列表中的每个第 n 个值执行算术运算的最 Pythonic 方式是什么?例如,如果我从 list1 开始:

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我想每第二个项目加 1,这将给出:

list2 = [1, 3, 3, 5, 5, 7, 7, 9, 9, 11]

我试过了:

list1[::2]+1

还有:

for x in list1:
    x=2        
    list2 = list1[::x] + 1

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

    您可以将slicing 与列表理解一起使用,如下所示:

    In [26]: list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    In [27]: list1[1::2] = [x+1 for x in list1[1::2]]
    
    In [28]: list1
    Out[28]: [1, 3, 3, 5, 5, 7, 7, 9, 9, 11]
    

    【讨论】:

    • 使用 Enthought Canopy 中的控制台。你用控制台吗?
    • 我在 Notepad ++ 中编写代码,当我需要尝试某些东西时只会使用 python 命令行解释器。我在编写大部分代码的机器上没有管理员权限。控制台和交互式解释器有什么区别 (>>>)
    • 使用 Canopy 之类的东西,您可以访问在运行程序时创建的变量
    • 这看起来只是 iPython 解释器,而不是特定于一个 IDE。
    • @Igor,试试 IPython;这就是In/Out 格式的来源。
    【解决方案2】:

    numpy 也允许您对切片使用+= 操作:

    In [15]: import numpy as np
    
    In [16]: l = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    
    In [17]: l[1::2] += 1
    
    In [18]: l
    Out[18]: array([ 1,  3,  3,  5,  5,  7,  7,  9,  9, 11])
    

    【讨论】:

      【解决方案3】:

      使用enumeratelist comprehension

      >>> list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      >>> [v+1 if i%2!=0 else v for i,v in enumerate(list1)]
      [1, 3, 3, 5, 5, 7, 7, 9, 9, 11]
      

      【讨论】:

        【解决方案4】:
        list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        for i in range(1, len(list1), 2):
            list1[i] +=1
        print(list1)
        

        使用 i%2 似乎效率不高

        【讨论】:

        • % 效率不高可能在 20 年前是正确的。在任何现代 CPU 上,它都与任何其他基本数学运算一样快。
        • %2 在整数类型上非常有效。对于不是二的幂的除数,不是那么多。
        【解决方案5】:

        试试这个:

        list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        for i in range(1,len(list1),2):
            list1[i] += 1
        

        【讨论】:

        • 我会伸出脖子说我更喜欢这个答案而不是切片。为什么?因为它是一个非常 Pythonic 且非常强大的通用形式的实例:for i in generator(args):
        • 似乎与 Divisadero 10 分钟前发布的答案完全相同。
        【解决方案6】:

        您可以创建一个表示增量的迭代器 (itertools.cycle([0, 1]),然后将其元素添加到您现有的列表中。

        >>> list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        >>> [a + b for a,b in zip(list1, itertools.cycle([0,1]))]
        [1, 3, 3, 5, 5, 7, 7, 9, 9, 11]
        >>>
        

        【讨论】:

          【解决方案7】:
          a = [i for i in range(1,11)] 
          #a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
          b = [a[i]+1 if i%2==1 else a[i] for i in range(len(a))] 
          #b = [1, 3, 3, 5, 5, 7, 7, 9, 9, 11]
          

          【讨论】:

          • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。 - From review
          猜你喜欢
          • 2021-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-06
          • 2015-09-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多