Python - Flipping Binary 1's and 0's in a String

>>> ''.join('1' if x == '0' else '0' for x in '1000110')
'0111001'

The a for b in c pattern is a generator expression, which produces a series of items based on a different series. In this case, the original series is the characters (since you can iterate over strings in Python, which gives you the characters that make up that string), and the new series is a set of characters with the 0's and 1's flipped.

'1' if x == '0' else '0' is pretty straightforward - it gives us whichever of 1 or 0 isn't x. We do this for each such x in the original set of characters, and then join() them all together (with an empty string '', a.k.a. nothing, in between each item), thus giving us a final string which is all of the opposite characters from the original, combined.


Another way to do it is with string.translate() and string.maketrans()

from string import maketrans
bitString = "10101010100011010"
flippedString = bitString.translate(maketrans("10","01"))

Amber's answer, while superior, possibly isn't the most clear, so here's a super basic iterative example:

b_string = "1100101"
ib_string = ""

for bit in b_string:
  if bit == "1":
    ib_string += "0"
  else:
    ib_string += "1"

print ib_string

This can be done in much better ways...replacements, comprehensions, but this is an example.

I would learn from the other answers in this question once you understand the basis of this one. This method is slow and painful. For the best performance, as Muhammad Alkarouri pointed out, the string.translate/maketrans combo is the way to go. Right behind it is the comprehension. My code is the slowest by a significant margin.

Tags:

Python