Python Forum

Full Version: Translating this to a list comprehension?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi,

Say that I have these for-loops:
s = ''

for y in range(a):
    for x in range(b):
        if (x, y) in some_collection:
            s += 'x'
        else:
            s += '-'

    s += '\n'
I want to translate it into a list comprehension (for fun, as an exercise  Wink ) , and I've come this far:
''.join(['x' if (x, y) in some_collection else '-' for y in range(a) for x in range(b)])
But I still need to add a newline character ('\n') after every iteration of the first loop. How do I do that? Is it even possible?


Thanks!

/gb
what does some_collection look line?
If it's of any importance, it's a set consisting of tuples on the form (int, int).

Thanks!  Wink
I should have explained why I wanted to know.
In order to make sure a response is correct, we like to test it before replying.
The snippet of code will not run without an actual example.
We answer hundreds of requests on this forum daily, so need snippets that will
work 'out of the box', and don't usually have time to create these ourselves (will do
sometimes when traffic is slow).
Oh, okay, completely understandable (I'm new to the forum Smile ).

If we say that some_collection is defined as follows:
some_collection = {(3, 2), (0, 0), (2, 0), (2, 2), (4, 2), (1, 0)}
Then follows that a >= 2 (the greatest y) and b >= 4 (the greatest x). For the code to make sense, it should actually look like this:

some_collection = {(3, 2), (0, 0), (2, 0), (2, 2), (4, 2), (1, 0)}
s = ''
 
for y in range(2, -1, -1):
    for x in range(4 + 1):
        if (x, y) in some_collection:
            s += 'x'
        else:
            s += '-'
 
    s += '\n'

print(s)
When run it produces the following output:
--xxx
-----
xxx--
In other words it's printing a coordinate system. Meanwhile, my own list comprehension solution:
''.join(['x' if (x, y) in some_collection else '-' for y in range(2, -1, -1) for x in range(4 + 1)])
Produces this faulty output:
--xxx-----xxx--
It lacks line breaks, and I don't know how to add them in the list comprehension or if it's even possible.


I hope that clear things up! Thanks.  Big Grin

/gb
You don't want a list but a string. That's why you wrap the comprehended list inside ''.join()

Now if you want to add newlines characters after each row, you would need to wrap the inside list into '\n'.join() as well.
Oh, of course. Thanks!

Working code:
'\n'.join([''.join(['x' if (x, y) in some_collection else '-' for x in range(5)]) for y in range(2, -1, -1)])