шаг в Python-bitstring 2.2.0 - PullRequest
       24

шаг в Python-bitstring 2.2.0

1 голос
/ 19 апреля 2011

Обновление: в python-bitstring 3.0.0 step имеет общепринятое значение

Я использую python bitstring , у меня загружен ConstBitArray из файла, и я хотел бы получить фрагмент с шагом, отличным от 1.

В обычном списке я бы просто сделал:

s = mylist[start:stop:step]

однако у цепочки битов есть странное определение для перехода, см .:

http://packages.python.org/bitstring/slicing.html#stepping-in-slices

кто-нибудь знает, как это сделать?

спасибо

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Обновление: Поведение степпинга в модуле цепочки битов изменилось в версии 3 на более привычное значение. Ответ ниже относится к битовой версии 2.


Я являюсь автором модуля цепочки битов, поэтому могу помочь (или хотя бы объяснить!). Как уже отмечалось, step используется для предоставления множителя - это полезно, если вы хотите указать байты или другие кратные биты (поэтому s[a:b:c] совпадает с s[a*c:b*c]).

Для поведения, которое вам, по-видимому, нужно, нет такого компактного синтаксиса. Мне было бы интересно узнать, для чего он вам нужен - я никогда не мог придумать, как его использовать, поэтому было выбрано другое использование для шага. Лучший эквивалент, который я могу придумать, это

s = ConstBitArray().join(mylist[i:i+1] for i in range(start, stop, step))

Это вряд ли будет очень быстро.

Если все, что вы хотите сделать, это проверить, что все или какие-либо биты установлены / не установлены, вы можете использовать что-то вроде

mylist.all(True, range(start, stop, step))

или

mylist.any(False, range(start, stop, step))

Другой, возможно, более быстрый способ сделать это - использовать модуль bitarray для нарезки:

import bitarray
s = ConstBitArray(bitarray.bitarray(mylist)[start:stop:step])

Если вам нужна именно эта функция нарезки, вам лучше использовать bitarray, хотя она пока недоступна для Python 3.

1 голос
/ 19 апреля 2011

По приведенной вами ссылке совершенно ясно, что они решили сделать mylist[start:stop:step] синтаксический сахар для mylist[start*step:stop*step], что, к сожалению, означает, что вы не сможете использовать этот шаг обычным образом

Вы можете попробовать что-то перечислить в качестве замены

[mylist[i] for i in range(start,stop,step)]
...