2017-02-09 3 views
0

У меня есть список, состоящий из 0 и 1. Список должен в идеале выглядеть следующим образом: 0,1,0,1,0,1,0,1,0,1,0,1,0,1 .....Заполните пропущенные значения в списках

Но из-за некоторой ошибки при регистрации , мой список выглядит так: 0,1,0,1,1,1,0,1,0,0,0,1,0,1 .... Как видно, есть некоторые пропущенные 0 и 1 в средний. Как я могу исправить этот список, чтобы добавить эти 0 и 1 между отсутствующими элементами, чтобы получить желаемые значения списка.

Вот код, используемый мной, эта задача для меня, но это не самый пифонический способ написания сценариев. Итак, как я могу улучшить этот скрипт?

l1 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1] 
indices = [] 
for i in range(1,len(l1)): 
    if l1[i]!=l1[i-1]: 
     continue 
    else: 
     if l1[i]==0: 
      val=1 
     else: 
      val=0 
     l1.insert(i, val) 

EDIT

Как спросили в комментариях, Позвольте мне объяснить, почему это важно, а не генерируя 1 и 0. У меня есть импульс TTL, то есть серия HIGH (1) и LOW (0), входящая и одновременно время для каждого из этих импульсов TTL регистрируется на двух машинах с разными часами.

Теперь, когда машина I чрезвычайно стабильна и регистрирует каждую последовательность HIGH (1) и низкой (1) точно, другая машина не хватает пары из них, и в результате у меня нет информации о времени для этих ,

Все, что я хотел, это объединить недостающий импульс TTL на одной машине на другую машину. Теперь это позволит мне выровнять время на обоих из них или log Нет для не полученных импульсов.

Причина для этого, а не для исправления ведения журнала (как указано в комментариях) заключается в том, что это старые собранные данные. Теперь мы исправили проблему ведения журнала.

+5

Любопытно, почему один будет беспокоить фиксации списка 0 и 1, когда вы можете легко создать этот список на любой длине , – odin

+3

Я голосую за то, что вы пытаетесь установить регистрацию, а не на неправильный вывод. – synchronizer

+1

Вы упомянули, что список ** идеально ** выглядит ** 0, 1, 0, 1 ** и не всегда. Таким образом, нет никакой гарантии, что это будет ** 0, 1, 0, 1 **. В этом случае, как бокс список решить вашу проблему? –

ответ

1

Вы можете попробовать что-то вроде этого:

from itertools import chain 

l1 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1] 

c = max(l1.count(0), l1.count(1)) 
print list(chain(*zip([0]*c,[1]*c))) 

Выход:

[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1] 
1

почему у вас есть список 0,1,0,1,0,1? нет веской причины, о которой я могу думать. ой хорошо Thats выходит за рамки этого вопроса я думаю ...

list(itertools.islice(itertools.cycle([0,1]),expected_length)) 
1

Просто умножать новый список.

>>> l1 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1] 
>>> l1 
[0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1] 
>>> [0,1] * (len(l1)//2) 
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1] 

Если список содержит нечетное число элементов, добавить необходимые 0:

>>> l2 = [0,1,0,1,1,1,0,1,0,0,0,1,0,1,0] 
>>> l2_ = [0,1] * (len(l1)//2) 
>>> if len(l2)%2: l2_.append(0) 
... 
>>> l2 
[0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0] 
>>> l2_ 
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] 
+0

duh moment: D. Просто «если еще» один раз, будет выглядеть чище. – MYGz

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