迭代内的多个条件,Python

时间:2010-12-15 08:39:32

标签: python iteration conditional-statements

我正在使用其API编写一些软件的附加组件。我需要做的是提取必要的数据。 我使用'FOR'去思考API类。每个对象都有属性:index(从0开始),type(Lin,Ptp和其他一些)和value。通过对象列表,我对两种类型的对象感兴趣 - 那些类型为'Lin'或'Ptp'的对象;所以应该满足一些条件:

至于林型:

  • 如果Lin之前有一些Ptp(虽然它们之间可能还有其他类型的其他对象),Lin获得了Ptp的值[Ptp .... Lin]。
  • 如果Lin之前还有其他一些Lin(虽然他们之间可能还有其他类型的其他对象),Lin会得到之前最接近林的价值[Lin ...... Lin]。
  • 如果Lin之前既没有Lin也没有Ptp(虽然他们之间可能还有其他类型的其他对象),Lin的值为“0”[... Lin]。

对于Ptp类型,它总是有自己的值

由于我是Python的初学者,我现在的情况好坏参半,我无法提出合适的算法。

我在想它应该是这样的:

for object in obects:
   If object.type == Ptp:
     ...object gets its own value
   elif object.type == Lin:
     ...

此处,根据[...Lin][Lin...Lin][Ptp...Lin]

应该有其他3个条件

3 个答案:

答案 0 :(得分:2)

  

由于我是Python的初学者,我现在的情况好坏参半,我无法提出合适的算法。

如果您尝试提供适当的算法退后一步忘记Python (C ++,Fortran,Logo,Awk等等)并考虑您要解决的问题。尝试在纸上写一些伪代码。

从您的伪代码中,Python应该变得更加明显,并且任何技术的困难都可以作为StackOverflow上的更具体的问题(例如)或者向您的同事询问。

答案 1 :(得分:1)

我建议你迭代你的对象,并记住LinPtp类型的最后一次出现(无论那些......:)):

lastOccurrence = None
for obj in objects:
    if obj.type not in ('PtP', 'Lin'):
        continue

    if obj.type == 'Lin':
        if lastOccurrence is not None:
            obj.value = lastOccurrence.value
        else:
            obj.value = "0"

    lastOccurrence = obj                

或类似的......

答案 2 :(得分:0)

我会使用名为finite-state machine或FSM的内容来浏览API对象。当您遇到不同类型和相关属性时,您可以存储有关FSM“状态”中所见内容的信息,该状态还确定在下一个“事件”(您正在迭代的项目)发生或遇到时会发生什么。收集的信息可以根据需要输出(即达到某种状态时。

FSM是一个相当简单的概念,精益和编程(几乎所有语言),对这类问题非常有用。