在元组中找到确切的字符串

时间:2013-11-25 21:09:32

标签: python tuples lookup

我正在使用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

2 个答案:

答案 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具有名为typeNameNametype的属性(这些属性的上/下案例是正确的,并且是正确的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