在Python中更有效地连接字符串

时间:2013-12-16 22:49:21

标签: python coding-style performance

我已经学习了几个月的Python,并希望了解一种更清晰,更有效的编写此函数的方法。这只是我用来查找靠近我的公交车时间的基本内容,然后在LCD上显示mtodisplay的内容,但我不确定mtodisplay = mtodisplay + ...行。必须有一种更好,更智能,更Pythonic的连接字符串的方式,而不需要求助于列表(我想将这个字符串直接输出到LCD。节省我的时间。也许这是我的问题......我正在采取捷径)。< / p>

同样,我使用countit和thebuslen的方法看起来有点荒谬!我真的很欢迎一些建议或指示,使这更好​​。只是想学习!

由于

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

2 个答案:

答案 0 :(得分:3)

我不确定'求助于名单'是什么意思,但是这样的话:

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)

答案 1 :(得分:3)

像这样连接字符串

        mtodisplay = mtodisplay + thebuses['expected_departure_time']

过去非常低效,但是很长一段时间以来,Python确实重用了被连接的字符串(只要没有其他引用),所以它是线性性能而不是旧的二次性能,应该绝对是要避免。

在这种情况下,您似乎已经有一个要在其间插入逗号的项目列表,所以

','.join(some_list)

可能更合适(并且自动意味着你最后没有额外的逗号)。

所以下一个问题是构建列表(也可能是生成器等)。 @bgporter显示了如何制作列表,因此我将显示生成器版本

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