如何将一个列表中的某些值替换为相同类型的另一个列表?

时间:2012-01-05 16:43:52

标签: python

我在安排和替换python列表或数组方面遇到了问题。 我有两个数组,比如a和b as,

a = [[ 0.   0.  -2.5  0. ]
     [ 0.   0.  -2.   0. ]
     [ 0.   0.  -1.5  0. ]
       ...............,
     [ 2.5  2.   1.   0. ]
     [ 2.5  2.   1.5  0. ]
     [ 2.5  2.   2.   0. ]]    

总共有300行,每行有4个元素。在哪里排列为[ x y z val ], 这意味着对于每个x,y,z点我有一个值'val',它初始化为零为300 点。 x,y,z具有最小值和最大值x-min = 0,x-max = 2.5; y-min = 0,y-max = 2.0; z-min = -2.5,z-max = 2.0。

我有另一个清单,b为

b = [[  0.         0.        -2.5       21.793416  ] 
     [  0.         0.5       -2.5       20.30 ] 
     [  0.         1.        -2.5       16.66   ] 
     [  0.         1.5        2.       -16.61 ] 
     [  0.         2.        -2.5        9.06  ] 
     [  0.         2.        -2.         9.81  ] 
     [  0.         2.        -1.5        9.65   ] 
     [  1.5        2.         0.5       -4.42  ] 
     [  1.5        2.         1.        -7.44  ] 
     [  1.5        2.         2.        -8.89  ] 
     [  2.         0.        -2.5       13.26  ] 
     [  2.         0.         1.5       -9.81  ] 
     [  2.5        2.         0.5       -1.60 ]
     [  2.5        2.         1.        -3.48 ]
     [  2.5        2.         2.        -5.20  ]]    

b小于a(比方说15分)并且具有与上面[x y z val]相同的类型,其中 val 在这里不为零。

现在我需要将b的val插入到a的相应x,y,z中。这意味着对于等效的[x y z]点,我需要将val的值从b替换为a。哪个会修改列表a。

5 个答案:

答案 0 :(得分:1)

假设有python语法,你可以试试这样的东西:

mini_list_a = [(x,y,z) for x,y,z,_ in a]
for x,y,z,val in b:
    a[mini_list_a.index((x,y,z))] = [x,y,z,val]

答案 1 :(得分:1)

您是否考虑过将值存储在dict中,使用x,y和z的元组作为键?

所以你有:

a = { ( 0. ,  0. , -2.5) : 0. ,
      ( 0. ,  0. , -2. ) : 0. ,
      ( 0. ,  0. , -1.5) : 0. ,
      ...

如果您使用相同格式b dict,则更新a非常简单:

a.update(b)

答案 2 :(得分:1)

如果x,y,z和val是列表项(用逗号分隔)

a = [[ 0,   0,  -2.5,  0 ]
    [ 0,   0,  -2,   0 ]
    [ 0,   0,  -1.5,  0 ]]

b = [[  0,         0,        -2.5,       21.793416  ] 
    [  0,         0.5,       -2.5,       20.30 ]

for item in a:
    s = filter(lambda x: (x[0]==item[0]and x[1]==item[1] and x[2]==item[2]),b)
    if s:
        item[3] = s[0][3]

使用filter,您可以在b中搜索 x,y,z 三元组,如果找到,则将最后一项(值)设置为a中所选项目的第三个值

答案 3 :(得分:1)

假设ab是numpy数组,你可以这样做:

from itertools import imap, izip
index_map = dict(izip(
                   imap(tuple, a[:,0:3].tolist()),
                   xrange(len(a))))

for row in b:
   loc = index_map.get(tuple(row[0:3]))
   if loc is not None:
      a[loc, 3] = row[3]

使用上面的值完成后:

>>> a
array([[  0.      ,   0.      ,  -2.5     ,  21.793416],
       [  0.      ,   0.      ,  -2.      ,   0.      ],
       [  0.      ,   0.      ,  -1.5     ,   0.      ],
       [  2.5     ,   2.      ,   1.      ,  -3.48    ],
       [  2.5     ,   2.      ,   1.5     ,   0.      ],
       [  2.5     ,   2.      ,   2.      ,  -5.2     ]])

答案 4 :(得分:0)

index_to_a = dict((tuple(row[:3]),row) for row in a)
for x,y,z,val in b:
    index_to_a[x,y,z][3] = val