我有一个来自测量的多个向量的类。我需要迭代这些向量,但是只想使用选择的测量。我到目前为止构建的简化版本如下:
import pylab as pl
class IterationReturn(object):
def __init__(self):
self.a = (1,2,3,4,5,6,7,8,9)
self.b = (10,20,30,40,50,60,70,80,90)
self.c = (-1,-2,-3,-4,-5,-6,-7,-8,-9)
self.i = 0
def returnNextSet(self):
self.aIter = self.a[self.i]
self.bIter = self.b[self.i]
self.cIter = self.c[self.i]
self.i +=1
return (self.aIter, self.bIter, self.cIter)
if __name__ == '__main__':
iteration = IterationReturn()
for i in range(len(iteration.a)):
# x takes aIter value from iteration.returnNextSet()
# y takes bIter value from iteration.returnNextSet()
x,y = iteration.returnNextSet()
pl.scatter(x, y)
pl.show()
我不想使用在此示例中可用的x,y,z = iteration.returnNextSet()
,但实际上我有更多的值,并且不想全部分配它们。我找不到仅指定给aIter
和bIter
的方法。
我有一个错误:
x,y = iteration.returnNextSet()
ValueError: too many values to unpack
在我的问题中我有很多测量值(a,b,...,z),例如我想指定x = d和y = k 我也认为它应该从一开始就以不同的方式完成,比如设计具有继承的新类但不知道如何做到这一点。非常感谢您的帮助
答案 0 :(得分:1)
执行此操作的最佳方法是返回字典:
return {'a': self.aIter, 'b':self.bIter, 'c': self.cIter, ...}
然后你可以分配:
NS = iteration.returnNextSet()
x, y = NS['x'], NS['y']
保持当前功能,您可以指定前两个值:
x, y = iteration.returnNextSet()[:2]
并且在Python 3中,您将能够将其余值分配给另一个元组:
x, y, *args = iteration.returnNextSet()
答案 1 :(得分:1)
不太确定你为什么要这样做,但这是一种方式:
class Test(object):
def __init__(self):
self.a = (1,2,3,4,5,6,7,8,9)
self.b = (10,20,30,40,50,60,70,80,90)
self.c = (-1,-2,-3,-4,-5,-6,-7,-8,-9)
def iter_over(self, *args):
items = [getattr(self, arg) for arg in args]
return zip(*items)
t = Test()
for a, c in t.iter_over('a', 'c'):
print a, c
1 -1
2 -2
3 -3
4 -4
5 -5
6 -6
7 -7
8 -8
9 -9
或者:
for items in t.iter_over('c', 'b', 'a'):
print items[1] # will be b (or 2nd passed above) etc...
答案 2 :(得分:1)
只是做:
results = iteration.returnNextSet()
然后将值称为results[0]
,results[1]
,依此类推。你可以len(results)
查看你有多少人。