Bottom Page

Thread Rating:
  • 2 Vote(s) - 3.5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 Translating this to a list comprehension?
#1
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
Quote
#2
what does some_collection look line?
Quote
#3
Smile 
If it's of any importance, it's a set consisting of tuples on the form (int, int).

Thanks!  Wink
Quote
#4
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).
Mekire likes this post
Quote
#5
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
Quote
#6
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.
nilamo likes this post
Quote
#7
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)])
nilamo likes this post
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  List comprehension Uchikago 3 125 10 hours ago
Last Post: scidam
  making the code easier, list comprehension go127a 2 168 May-26-2019, 06:19 PM
Last Post: Gribouillis
  Using function argument in lists comprehension. blackknite 5 291 Apr-23-2019, 09:59 PM
Last Post: snippsat
  dictionary: print key/value with list(dict) comprehension wardancer84 4 409 Nov-14-2018, 03:14 PM
Last Post: wardancer84
  calling a function in a comprehension Skaperen 1 475 Jul-13-2018, 09:12 PM
Last Post: gontajones
  List Comprehension to exclude first row tkj80 5 1,422 Jun-11-2018, 09:24 AM
Last Post: volcano63
  need 2x elements in list comprehension Skaperen 7 947 Apr-30-2018, 02:16 AM
Last Post: Skaperen
  one comprehension with more elements Skaperen 4 706 Mar-31-2018, 02:47 AM
Last Post: wavic
  list comprehension HenryJ 3 629 Feb-21-2018, 12:43 PM
Last Post: buran
  List Comprehension zowhair 2 678 Dec-29-2017, 10:52 AM
Last Post: zowhair

Forum Jump:


Users browsing this thread: 1 Guest(s)