Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将一个列表中的某些值替换为另一个相同类型的值?_Python - Fatal编程技术网

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

Python 如何将一个列表中的某些值替换为另一个相同类型的值?,python,Python,我在安排和替换python列表或数组时遇到问题。 我有两个数组,假设a和b为 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个元素。其排列

我在安排和替换python列表或数组时遇到问题。 我有两个数组,假设a和b为

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',它初始化为0,代表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 as

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不是零


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

假设使用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]

假设使用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]

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

所以你会:

a = { ( 0. ,  0. , -2.5) : 0. ,
      ( 0. ,  0. , -2. ) : 0. ,
      ( 0. ,  0. , -1.5) : 0. ,
      ...
如果以相同的格式制作
b
a
dict
,则更新
a
非常简单:

a.update(b)

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

所以你会:

a = { ( 0. ,  0. , -2.5) : 0. ,
      ( 0. ,  0. , -2. ) : 0. ,
      ( 0. ,  0. , -1.5) : 0. ,
      ...
如果以相同的格式制作
b
a
dict
,则更新
a
非常简单:

a.update(b)

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


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

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


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

假设
a
b
是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     ]])

假设
a
b
是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     ]])

只是确定。。。
a
中的所有XYZ集是否唯一,对于
b
是否相同?这些看起来像NumPy数组。所有的点都是唯一的吗?您需要使用列表/数组吗?请确保。。。
a
中的所有XYZ集是否唯一,对于
b
是否相同?这些看起来像NumPy数组。所有的点都是唯一的吗?您需要使用列表/数组吗?对于
mini
部分,我会使用字典。查找速度更快:
dict_a=dict((tuple(row[:-1]),n)表示n,枚举(a)中的行表示
,然后
a[dict_a((x,y,z)),-1]=val
我会对
mini
部分使用字典。查找速度更快:
dict_a=dict((tuple(row[:-1]),n)for n,行in enumerate(a))
,然后
a[dict_a((x,y,z)),-1]=val
,只要OP不需要数组格式的数据,我认为这是可行的方法。只要OP不需要数组格式的数据,我认为这将是一条道路。