【问题标题】:Assigning multiple python list elements in one go一次性分配多个 python 列表元素
【发布时间】:2014-05-27 20:23:21
【问题描述】:

由于熟悉 MATLAB 编程语言,我正在寻找一种方便的方法来在 python 中实现以下赋值。

对于列表 L,给定索引 I 和值 R

    L = [10,20,30,40,50]
    I = [2,4,5]
    R = [200, 400, 500]

我想以与此类似的方式分配这些值

    L(I) = R

这应该产生

    L == [10,200,30,400,500]

python 的方法是什么?原始列表的副本也可以。

【问题讨论】:

    标签: python matlab vectorization slice


    【解决方案1】:

    没有numpy

    L = [10,20,30,40,50]
    I = [1,3,4]
    R = [200, 400, 500]
    
    for i,j in enumerate(I):
        L[j] = R[i]
    
    print L
    

    产量:

    [10, 200, 30, 400, 500]
    

    【讨论】:

      【解决方案2】:

      如果您喜欢使用numpy

          import numpy
      
          L = numpy.array([10,20,30,40,50])
          I = numpy.array([1,3,4])   # note the index difference (index by 0)
          R = numpy.array([200,400,500])
          L[I] = R
          print L
      

      产量

          [ 10 200  30 400 500]
      

      【讨论】:

      • 啊,太好了。这是否也适用于其他数据类型,例如字符串?
      • +1 用于指出 MATLAB 基于索引 1,而 Python 基于索引 0。
      • @knedlsepp,是的,你可以创建字符串类型的numpy数组,并做类似的操作。
      【解决方案3】:

      基本非numpy解决方案:

      您不需要numpy(尽管这是更好的解决方案)。这是一种不用numpy的方法:

      L = [10,20,30,40,50]
      I = [2,4,5]
      R = [200, 400, 500]
      
      for i in range(len(I)):
              L[I[i]-1] = R[i]
      
      print(L)
      

      给你:

      [10, 200, 30, 400, 500]
      

      注意:我在I[i] 上做了I[i]-1,因为Matlab 是base 1,而Python 是base 0。

      一个班轮解决方案:

      这是一个单行列(虽然它会创建一个新列表):

      L = [10,20,30,40,50]
      I = [1,3,4]  #fixed indexes manually
      R = [200, 400, 500]
      
      NL = [R[I.index(x)] if x in I else L[x] for x in range(len(L))]
      
      print(NL)
      

      结果:

      [10, 200, 30, 400, 500]
      

      【讨论】:

        【解决方案4】:
        for ndx, value in zip(I,R):
            L[ndx-1] = value
        

        【讨论】:

          猜你喜欢
          • 2019-06-11
          • 2020-06-22
          • 2015-04-03
          • 1970-01-01
          • 2018-05-06
          • 2019-08-31
          • 2011-06-14
          • 1970-01-01
          • 2017-11-29
          相关资源
          最近更新 更多