Python 如何将一个列表中的某些值替换为另一个相同类型的值?
我在安排和替换python列表或数组时遇到问题。 我有两个数组,假设a和b为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个元素。其排列
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
adict
,则更新a
非常简单:
a.update(b)
您是否考虑过将值存储在
dict
中,使用x、y和z的元组作为键
所以你会:
a = { ( 0. , 0. , -2.5) : 0. ,
( 0. , 0. , -2. ) : 0. ,
( 0. , 0. , -1.5) : 0. ,
...
如果以相同的格式制作b
adict
,则更新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不需要数组格式的数据,我认为这将是一条道路。