2016-09-01 2 views
-1

У меня есть список объектов, у которых есть атрибуты серийного номера (SN) и даты и времени вместе с другими. Из того, как создается список, объекты должны быть в хронологическом порядке. В объектах могут быть следующие SN:Как найти последовательные/последовательные объекты в списке объектов

1,1,1,1,1,2,2,2,3,3,3,3,3,3,2,2,2,1,2, 2,2,2,3,3,1,1,1,3, ...

Как я могу извлечь первые временные метки всех последовательных последовательностей SN. Например, для SN = 1, которая будет первой по времени, а также с 17-го и 24-го по 26-е. То же самое для всех SN, которые отображаются в списке объектов. Что я хочу сделать - это диаграмма, подобная Ганту, чтобы показать, в какие времена присутствовали эти SN.

+0

Как я понимаю, у вас есть два варианта: список понимание (http://www.secnetix.de/olli/Python/list_comprehensions.hawk) или использовать filter (https://docs.python.org/2/library/functions.html#filter). – Jblasco

ответ

0

Если я правильно понял ваш вопрос, возможно, вы ищете что-то вроде этого?

def consecutive(nums, sn): 
    count = {nums[0]: [[0]]} 
    for idx, num in enumerate(nums[1:]): 
     if num == nums[idx]: 
      try: 
       count[num][-1][1] = idx + 1 
      except IndexError: 
       count[num][-1].append(idx + 1) 
     else: 
      try: 
       count[nums[idx]][-1][1] = idx + 1 
      except IndexError: 
       count[nums[idx]][-1].append(idx + 1) 
      try: 
       count[num].append([idx + 1]) 
      except KeyError: 
       count[num] = [[idx + 1]] 
    return count[sn] 

тест:

test = [1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 1, 2, 2, 2, 2, 3, 3, 1, 1, 1, 3] 
print consecutive(test, 3) # will return [[8, 14], [21, 23], [26]], which are the index ranges for SN = 3 
+0

Спасибо, этот код. Я все еще пытаюсь понять, что здесь происходит. Другой вопрос: как мне это сделать, если я хочу получить индексы первого из серии или одного SN, а затем первый из следующих значений sn (или последний из SN, если нет других)? поэтому для SN = 3 в моем примере это должно привести к [[8,14], [21,23], [26]]. – Lorenz

+0

В основном я продолжаю обновлять словарь под названием 'count' при повторении данного списка. Если он переходит в блок 'else', значит, текущий' num' отличается от предыдущего. Чтобы внести это изменение, в блоке 'else' вам необходимо обновить предыдущий (' count [num [idx]] ') перед внесением изменений в счетчик [num]. Я только что обновил свое решение. –

+0

Большое вам спасибо. Теперь я проработаю код, который вы предоставили! – Lorenz

Смежные вопросы