2023年7月26日发(作者:)
python中list函数替换元素_python-⽤类实例替换数组中的元素这类似于this,所以请先阅读它,以了解我要做什么.现在,我想在有类实例时进⾏替换.import numpy as npclass B():def __init__(self, a,b):self.a = aself.b = barr = ([ [1,2,3,4,5],[6,7,8,9,10] ])b1 = ([B(100,'a'),B(11,'b'),B(300,'c'),B(33,'d')])b2 = ([B(45,'a'),B(65,'b'),B(77,'c'),B(88,'d')])# My d array will be like that and I will have to# run 3 loops as below . I can't change thatd = ([[b1],[b2]],dtype=object)# Replace the elementsfor i in d:for y in i:for idx,el in enumerate(y):#y[idx].a = e(-1,5) # 5 is the size of every sublength of arr#print(y[idx].a)pass# Show the updated valuesfor i in d:for y in i:for idx,x in enumerate(y):print(y[idx].a)我不能使⽤b = e(-1,),因为它必须在循环之外运⾏.但是,正如我所说的,b数组将是y [idx] .value,所以我不能只能将其放置在第3循环中,因为我将获得错误的结果,也不能将其放置在第3循环之外,因为我将⽆法访问类实例的值部分.我希望我的结果是:b1 = ([B(1,'a'),B(2,'b'),B(3,'c'),B(4,'d'),B(5,'d')])b2 = ([B(6,'a'),B(7,'b'),B(8,'c'),B(9,'d'),B(10,'d')])因此,我只想填写B类实例的⼀部分.并请注意,与之前(在上⼀个问题中)⼀样,B进⾏了扩展以容纳arr中的所有5个值.简⽽⾔之,请检查arr的每个⼦列表的长度(现在为5),并相应地更新d值.因此,如果b1和b2具有4个值,则它们必须成为5个值(来⾃arr的前5个值和来⾃arr的下5个值).解决⽅法:所以我加print()print(d)并得到2249:~/mypy$python3 (2, 1, 4)[[[<__main__.B object at 0xb71d760c> <__main__.B object at 0xb71d7aac><__main__.B object at 0xb71d7acc> <__main__.B object at 0xb71e5cec>]][[<__main__.B object at 0xb391718c> <__main__.B object at 0xb39171ac><__main__.B object at 0xb39171cc> <__main__.B object at 0xb39171ec>]]]我向B添加__repr__1231:~/mypy$python3 (2, 1, 4)[[[B(100, a) B(11, b) B(300, c) B(33, d)]][[B(45, a) B(65, b) B(77, c) B(88, d)]]]添加import itertoolsfor a,b in _longest(arr[0,:],b1):print(a,b)产⽣1 B(100, a)2 B(11, b)3 B(300, c)4 B(33, d)5 None更改为:newlist = []for a,b in _longest(arr[0,:],b1):if b is not None:new_b = B(a, b.b)last_b = belse:new_b = B(a, last_b.b)(new_b)print((newlist))产⽣[B(1, a) B(2, b) B(3, c) B(4, d) B(5, d)]将其分配给b1,然后重复a [1 ,:]和b2.为了更加简洁,我可以将new_b代码编写为⼀个函数,然后将循环重写为列表理解.是的,我可以在适当位置修改b,例如b.a = a但是由于我需要创建⼀个新的B对象来替换None,所以⿇烦.我不能将新的B对象添加到原始b1数组中.因此,通过列表创建新数组更为简单.我可以⽤以下⽅法就地改变d和b1:def replace(a,b):b.a = af = func(replace, 2, 1)f(arr[:,None,:4], d) # produces array of None; ignoreprint(d)print(b1)[[[B(1, a) B(2, b) B(3, c) B(4, d)]] # chgd d[[B(6, a) B(7, b) B(8, c) B(9, d)]]][B(1, a) B(2, b) B(3, c) B(4, d)] # chgd b1我只是使⽤frompyfunc作为⼀种懒惰的⽅式,对d⼴播arr并遍历所有元素.请注意,我必须更改arr以匹配d形状.同样,这不会添加任何新的B().显然,您不能就地执⾏此操作.我的B是class B():def __init__(self, a,b):self.a = aself.b = bdef __repr__(self):return 'B(%s, %s)'%(self.a, self.b)和frompyfunc⼀起玩:getB_b = func(lambda x: x.b, 1,1) # fetch b attributesprint(getB_b(d))#[[['a' 'b' 'c' 'd']]## [['a' 'b' 'c' 'd']]]mkB = func(B, 2,1) # build array of B() with broadcastingprint(mkB(arr, ['a','b','c','d','e']))# [[B(1, a) B(2, b) B(3, c) B(4, d) B(5, e)]# [B(6, a) B(7, b) B(8, c) B(9, d) B(10, e)]]print(mkB(arr[:,:4], getB_b(d[:,0,:])))# [[B(1, a) B(2, b) B(3, c) B(4, d)]# [B(6, a) B(7, b) B(8, c) B(9, d)]]编辑评论arr1 = ([ [1,2],[6,7] ])newlist = []for a,b in _longest(arr1[0,:],b1):if b is not None:new_b = B(a, b.b)last_b = belse:new_b = B(a, last_b.b)(new_b)print((newlist))产⽣[B(1, a) B(2, b) B(None, c) B(None, d)]当arr较短时,a将为None(⽽不是b);所以我们需要测试⼀下def foo(arr,bn):newlist = []for a,b in _longest(arr,bn):print(a,b)if a is None:passelse:if b is not None:new_b = B(a, b.b)last_b = belse:new_b = B(a, last_b.b)(new_b)return newlistprint((foo(arr1[0,:],b1))) # arr1 shorterprint((foo(arr[0,:], b2))) # arr longer测试:1 B(1, a)2 B(2, b)None B(3, c)None B(4, d)[B(1, a) B(2, b)]1 B(6, a)2 B(7, b)3 B(8, c)4 B(9, d)5 None[B(1, a) B(2, b) B(3, c) B(4, d) B(5, d)]没有什么特别的或不可思议的;确保我正确地通过if测试和缩进即可.标签:python,numpy
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690307694a329897.html
评论列表(0条)