Последний элемент (bitstring.BitArray) в списке неверен после XORing python

У меня есть фрагмент кода:

#!/usr/bin/python3

from bitstring import BitArray
import itertools

# Helper functions

def get_bitset_by_letter(letter, encoding):
    return encoding[letter] if letter in encoding else None

def get_letter_by_bitset(bitset, encoding):
    for letter, encoding_bitset in encoding.items():
        if bitset == encoding_bitset:
            return letter

    return None

class Word():
    def __init__(self, word, encoding):
        self.encoding = encoding
        self.as_word = ''
        self.as_bits = []

        if isinstance(word, str):
            self.as_word = word
            self._encode_to_bits()
        elif all(isinstance(i, BitArray) for i in word):
            self.as_bits = word
            self._decode_to_word()
        else:
            raise('class Word: Unexpected type of word arg')

    def __ixor__(self, other):
        for index, bitset in enumerate(other.as_bits):
            print('In XOR: %d-%s-%s' % (index, self.as_bits[index], bitset))
            self.as_bits[index] ^= bitset
        return self

    def as_bits(self):
        return self.as_bits

    def as_word(self):
        return self.as_word

    def _encode_to_bits(self):
        for letter in self.as_word:
            bitset = get_bitset_by_letter(letter, self.encoding)
            if bitset is None:
                raise('Can not find bitset by given letter %s in encoding.' % str(letter))
            else:
                self.as_bits.append(bitset)

    def _decode_to_word(self):
        for bitset in self.as_bits:
            letter = get_letter_by_bitset(bitset, self.encoding)
            if letter is None:
                raise('Can not find letter by given bitset %s in encoding.' % str(bitset))
            else:
                self.as_word += letter

def main():
    encoding = {
        'A': BitArray(bin='000'),
        'B': BitArray(bin='001'),
        'C': BitArray(bin='010'),
        'D': BitArray(bin='011'),
        'E': BitArray(bin='100'),
        'F': BitArray(bin='101'),
        'G': BitArray(bin='110'),
        'H': BitArray(bin='111'),
    }

    print(encoding)
    print()

    word_1 = Word('ABCHE', encoding)
    print('word_1 = %s' % word_1.as_bits)
    word_2 = Word('FGDEA', encoding)
    print('word_2 = %s' % word_2.as_bits)
    word_1 ^= word_2
    print(word_1.as_bits)


if __name__ == '__main__':
    main()

Детали: я использую bitstring.BitArray класс для представления буквы как набора из трех битов и кодовых слов таким образом (своего рода домашняя задача). Кроме того, мой код должен быть в состоянии сделать XOR для этих слов. Проблема: каждый последний элемент для other.as_bits список имеет неправильное значение, когда он прибывает в функцию. Если я прокомментирую строку

#self.as_bits[index] ^= bitset

последнее значение other.as_bits верно. Что я делаю неправильно?

Вот вывод (python 3.5.2):

{'C': BitArray('0b010'), 'B': BitArray('0b001'), 'G': BitArray('0b110'), 
'F': BitArray('0b101'), 'A': BitArray('0b000'), 'H': BitArray('0b111'), 
'D': BitArray('0b011'), 'E': BitArray('0b100')}

word_1 = [BitArray('0b000'), BitArray('0b001'), BitArray('0b010'), BitArray('0b111'), BitArray('0b100')]

word_2 = [BitArray('0b101'), BitArray('0b110'), BitArray('0b011'), BitArray('0b100'), BitArray('0b000')]

In XOR: 0-0b000-0b101

In XOR: 1-0b001-0b110

In XOR: 2-0b010-0b011

In XOR: 3-0b111-0b100

In XOR: 4-0b100-0b101

[BitArray('0b101'), BitArray('0b111'), BitArray('0b001'), BitArray('0b011'), BitArray('0b001')]

Из этого видно, что последний 4-й элемент word_2 в __ixor__ является 0b101, должно быть 0b000

Спасибо!

1 ответ

Я решил это используя __xor__ вместо __ixor__,

Другие вопросы по тегам