2013-12-16 2 views
1

Я изучал Python в течение нескольких месяцев и хотел понять более чистый и эффективный способ написания этой функции. Это просто базовая вещь, которую я использую для поиска времени в автобусе рядом со мной, а затем отображение содержимого mtodisplay на ЖК-дисплее, но я не уверен в строке mtodisplay = mtodisplay + .... Должен быть лучший, более умный, более питоновский способ конкатенации строки, не прибегая к спискам (я хочу вывести эту строку прямо на ЖК-дисплей. Спасёт время. Возможно, это моя проблема ... Я использую ярлыки).Более эффективное слияние строк в Python

Аналогичным образом, мой метод использования 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 

ответ

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

Ах, блестящий! Спасибо - именно то, что мне нужно было изучить. Намного лучше. Будет использоваться гораздо чаще. Спасибо @hetepeperfan слишком – Will

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

Последнее, что я слышал, эта оптимизация использовалась для некоторых реализаций, но не для других. Используется ли он во всех реализациях? Имейте в виду, что существует много реализаций языка Python. – dstromberg

+0

@ dstromberg, хороший вопрос. Это не сложно измерить, запустив несколько тестов против конкретной реализации. –

+0

@gnibbler - спасибо. Я не уверен в различии между вашим генератором и тем, что предоставил bgporter. Но тогда я не знаю о генераторах и урожаях, поэтому я собираюсь [читать их сейчас!] ((Http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained) – Will

Смежные вопросы