Python Forum
Translating this to a list comprehension? - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Translating this to a list comprehension? (/thread-1257.html)



Translating this to a list comprehension? - gblomqvist - Dec-18-2016

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


RE: Translating this to a list comprehension? - Larz60+ - Dec-18-2016

what does some_collection look line?


RE: Translating this to a list comprehension? - gblomqvist - Dec-18-2016

If it's of any importance, it's a set consisting of tuples on the form (int, int).

Thanks!  Wink


RE: Translating this to a list comprehension? - Larz60+ - Dec-19-2016

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).


RE: Translating this to a list comprehension? - gblomqvist - Dec-19-2016

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


RE: Translating this to a list comprehension? - Kebap - Dec-19-2016

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.


RE: Translating this to a list comprehension? - gblomqvist - Dec-19-2016

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)])