Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Turning a 2d processing for loop into nested comprehensions with join

The following Python3 code takes an input list of bytes and prints out their hexadecimal "C style" representation, 12 per line:

def c_array_body_from_bytes(input_bytes):
    """Emit the provided bytes as the body of a C array."""
    lines = ""
    for i in range(0, len(input_bytes), 12):
        lines += "".join(f"0x{b:02x}, " for b in input_bytes[i : i + 12]) + "\n"
    return lines

print(c_array_body_from_bytes(range(64)))

Can this be expressed more tersely as a single return statement that uses a nested comprehension, without requiring the accumulator lines variable? If so, what does it look like?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

With a single statement based on combined str.joins:

lines = ''.join(''.join(map("0x{:02x}, ".format, input_bytes[i:i+12])) + '\n'
                for i in range(0, len(input_bytes), 12))

0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 
0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 
0x3c, 0x3d, 0x3e, 0x3f, 
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading