-1

私はコードのスニペットを持っています:

#!/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クラスを使用して文字を 3 ビットのセットとして表し、コード ワードをこのように表します (ある種のホームタスク)。また、私のコードはこの単語に対して XOR を実行できるはずです。問題: list の最後の要素はすべて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')]

このことから、 in の最後の 4 番目の要素は であることがword_2わかり__ixor__ます0b1010b000

ありがとうございました!

4

1 に答える 1

-1

__xor__の代わりに使用してこれを解決しまし__ixor__た。

于 2016-09-11T10:09:12.827 に答える