Will
Will

Reputation: 99

Concatenating strings more efficiently in Python

I've been learning Python for a couple of months, and wanted to understand a cleaner and more efficient way of writing this function. It's just a basic thing I use to look up bus times near me, then display the contents of mtodisplay on an LCD, but I'm not sure about the mtodisplay=mtodisplay+... line. There must be a better, smarter, more Pythonic way of concatenating a string, without resorting to lists (I want to output this string direct to LCD. Saves me time. Maybe that's my problem ... I'm taking shortcuts).

Similarly, my method of using countit and thebuslen seems a bit ridiculous! I'd really welcome some advice or pointers in making this better. Just wanna learn!

Thanks

json_string = requests.get(busurl)
the_data = json_string.json()
mtodisplay='220 buses:\n'
countit=0
for entry in the_data['departures']:
    for thebuses in the_data['departures'][entry]:
        if thebuses['line'] == '220':
            thebuslen=len(the_data['departures'][entry])
            print 'buslen',thebuslen
            countit += 1
            mtodisplay=mtodisplay+thebuses['expected_departure_time']
            if countit != thebuslen:
                mtodisplay=mtodisplay+','
return mtodisplay

Upvotes: 1

Views: 116

Answers (2)

bgporter
bgporter

Reputation: 36574

I'm not sure what you mean by 'resorting to lists', but something like this:

json_string = requests.get(busurl)
the_data = json_string.json()
mtodisplay= [] 

for entry in the_data['departures']:
    for thebuses in the_data['departures'][entry]:
        if thebuses['line'] == '220':
            thebuslen=len(the_data['departures'][entry])
            print 'buslen',thebuslen
            mtodisplay.append(thebuses['expected_departure_time'])

return '220 buses:\n' + ", ".join(mtodisplay)

Upvotes: 3

John La Rooy
John La Rooy

Reputation: 304473

Concatenating strings like this

        mtodisplay = mtodisplay + thebuses['expected_departure_time']

Used to be very inefficient, but for a long time now, Python does reuse the string being catentated to (as long as there are no other references to it), so it's linear performance instead of the older quadratic performance which should definitely be avoided.

In this case it looks like you already have a list of items that you want to put commas between, so

','.join(some_list)

is probably more appropriate (and automatically means you don't get an extra comma at the end).

So next problem is to construct the list(could also be a generator etc.). @bgporter shows how to make the list, so I'll show the generator version

def mtodisplay(busurl):
    json_string = requests.get(busurl)
    the_data = json_string.json()
    for entry in the_data['departures']:
        for thebuses in the_data['departures'][entry]:
            if thebuses['line'] == '220':
                thebuslen=len(the_data['departures'][entry])
                print 'buslen',thebuslen
                yield thebuses['expected_departure_time']

# This is where you would normally just call the function
result = '220 buses:\n' + ','.join(mtodisplay(busurl))

Upvotes: 3

Related Questions