Несколько условий внутри итерации, Python - PullRequest
0 голосов
/ 15 декабря 2010

Я пишу дополнение для некоторой программы, используя ее API. Что мне нужно сделать, это извлечь необходимые данные. Я использую 'FOR', чтобы использовать классы API. Каждый объект имеет свойства: индекс (от 0), тип (Lin, Ptp и некоторые другие) и значение. Просматривая список объектов, меня интересуют два типа объектов - те, которые имеют тип 'Lin' или 'Ptp'; поэтому должны быть выполнены несколько условий:

Что касается типа Лин:

  • если есть какой-то Ptp до Lin (хотя между ними могут быть и другие объекты других типов), Lin получает значение Ptp [Ptp .... 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:
     ...

Здесь должны быть другие 3 условия в соответствии с [...Lin] или [Lin...Lin] или [Ptp...Lin]

Ответы [ 3 ]

2 голосов
/ 15 декабря 2010

Поскольку я новичок в Python, мои мысли сейчас смешаны, и я не могу придумать подходящий алгоритм.

Если вы пытаетесь придумать подходящий Алгоритм , сделать шаг назад . Забудьте Python (C ++, Fortran, Logo, Awk и т. Д.) И подумайте о проблеме, которую вы пытаетесь решить.Попробуйте написать какой-нибудь псевдокод на бумаге.

Из вашего псевдокода Python должен стать более очевидным, и любые технические трудности могут быть заданы как более конкретные вопросы о StackOverflow (например) или заданы вашимколлеги.

1 голос
/ 15 декабря 2010

Я бы посоветовал вам перебрать свои объекты и вспомнить последнее вхождение типа Lin или Ptp (какими бы они ни были ...:)):

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                

или что-то в этом роде ...

0 голосов
/ 15 декабря 2010

Я бы использовал нечто, называемое конечным автоматом или FSM, чтобы пройти через объекты API. Когда вы сталкиваетесь с различными типами и связанными свойствами, вы можете хранить информацию о том, что было замечено в «состоянии» автомата, которое также определяет, что происходит, когда происходит или встречается следующее «событие» (элементы, над которыми вы перебираете). Собранная информация может выводиться по мере необходимости (т. Е. При достижении определенного состояния.

FSM - это довольно простая концепция для программирования и программирования (практически на любом языке) и очень полезная для решения подобных проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...