我正在使用python访问另一个程序的结果。该程序有一个特定的模块。不幸的是,我不理解结果出现的元组格式(“stuff”)。
我熟悉在词典中查找键/值,但不熟悉它是如何工作的。我是元组的新手,我使用的是2.7.5 - 任何帮助都会很棒!
>>> import OrcFxAPI
>>> model = model.OrcFxAPI('C:\#17.sim')
>>> stuff = model.objects
>>> print stuff
(<General Data: 'General'>, <Environment Data: 'Environment'>, <Line Contact Data: 'Line Contact Data'>, <Vessel: 'vesselA'>, <Vessel: 'vesselB'>, <Line: 'A'>, <Line: 'B'>, <Line: 'C'>, <Line: 'D'>, <Line: 'E'>, <Line: 'F'>)
>>> print type(stuff)
<type 'tuple'>
>>> print map(type, stuff)
[<class 'OrcFxAPI.OrcaFlexObject'>, <class 'OrcFxAPI.OrcaFlexObject'>, <class 'OrcFxAPI.OrcaFlexObject'>, <class 'OrcFxAPI.OrcaFlexVesselObject'>, <class 'OrcFxAPI.OrcaFlexVesselObject'>, <class 'OrcFxAPI.OrcaFlexLineObject'>, <class 'OrcFxAPI.OrcaFlexLineObject'>, <class 'OrcFxAPI.OrcaFlexLineObject'>, <class 'OrcFxAPI.OrcaFlexLineObject'>, <class 'OrcFxAPI.OrcaFlexLineObject'>, <class 'OrcFxAPI.OrcaFlexLineObject'>]
我想查找Line的实例,并输出'A','B','C','D','E','F':
>>> for thing in stuff:
if isinstance(thing, Line) and thing.name == 'C':
line_c = thing
break
else:
raise ValueError('No Line C in stuff!')
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
NameError: name 'Line' is not defined
答案 0 :(得分:3)
从你模糊的问题很难说出来,但我认为你想要的是这样的:
for thing in stuff:
if isinstance(thing, OrcFxAPI.OrcaFlexLineObject):
print thing.name,
print
或等同地:
lines = (thing for thing in stuff
if isinstance(thing, OrcFxAPI.OrcaFlexLineObject))
names = (line.name for line in lines)
print ' '.join(names)
如果您正在寻找具有特定名称的Line
对象,那就简单了:
for thing in stuff:
if isinstance(thing, OrcFxAPI.OrcaFlexLineObject) and thing.name == 'C':
line_c = thing
break
else:
raise ValueError('No Line C in stuff!')
......或:
line_c = next(thing for thing in stuff
if isinstance(thing, OrcFxAPI.OrcaFlexLineObject) and thing.name == 'C')
但总的来说,您不希望像“类型切换”代码那样执行此操作。最好以某种方式存储这些信息,使所有线条与所有其他东西分开。也许这个:
{'general': <General Data: 'General'>,
'environment': <Environment Data: 'Environment'>,
'line contact': <Line Contact Data: 'Line Contact Data'>,
'code checks': <Code Checks: 'Code Checks'>,
'shear7': <SHEAR7 Data: 'SHEAR7 Data'>,
'vessels': (<Vessel: 'vesselA'>, <Vessel: 'vesselB'>),
'lines': (<Line: 'A'>, <Line: 'B'>, <Line: 'C'>, <Line: 'D'>, <Line: 'E'>, <Line: 'F'>)
}
然后,只需使用dict查找(你已经知道该怎么做)并迭代一个序列(你已经知道该怎么做):
for line in stuff['lines']:
print line.name,
print
或者,甚至可能更好,使用类而不是dict,因此该对象具有lines
属性,您可以像这样使用:
for line in stuff.lines:
print line.name,
print
答案 1 :(得分:0)
OrcaFlexObject
类型的OrcFxAPI对象以及具有该基础的对象,例如OrcaFlexLineObject
具有名为typeName
,Name
和type
的属性(这些属性的上/下案例是正确的,并且是正确的PITA)。所以,如果我理解你的问题,你可以这样做:
>>> import OrcFxAPI
>>> model = model.OrcFxAPI('C:\#17.sim')
>>> lines = filter(lambda o: o.typeName=="Line",model.objects)
>>> for line in lines:
print line.Name
A
B
C
D
E
F