Python: как я узнаю, когда я в последний раз за цикл - PullRequest
0 голосов
/ 04 августа 2010
for i in range(len(results_histogram)):
    if i!=len(results_histogram)-1:
      url+=str(results_histogram[i])+','

Мой оператор if проверяет, нахожусь ли я в последнем цикле, но он не работает.что я делаю не так?

Ответы [ 5 ]

7 голосов
/ 04 августа 2010

Чтобы немного избежать вопроса, вы, кажется, переписали str.join:

','.join(results_histogram)

Если вы получите сообщение об ошибке типа TypeError: sequence item 0: expected string, int found, то вы можете преобразовать промежуточные результаты в строку с

','.join(map(str, results_histogram))

str.join, несомненно, более эффективен, чем конкатенация нескольких строк в цикле, потому что в Python строки являются неизменяемыми, поэтому каждая конкатенация приводит к созданию новой строки, которую затем приходится собирать мусором позже.


В частности, , ваш пример «не работает», потому что вы пропускаете последний элемент полностью, когда хотите пропустить добавление запятой. Это ясно и очевидно на небольшом примере:

>>> x = [1,2,3]
>>> for i in range(len(x)):
...   if i != len(x) - 1:
...     print str(x[i]) + ',',
... 
1, 2,

Чтобы вы могли переписать свой пример как

for i in range(len(results_histogram)):
    url += str(results_histogram[i])
    if i!=len(results_histogram)-1:
      url += ','

Но вы все равно должны придерживаться str.join.

2 голосов
/ 04 августа 2010

Я согласен с @Mark Rushakoff в том, что лучше всего использовать join.Я хотел просто прокомментировать это, но у меня не хватает представителя, чтобы сделать это = (

В любом случае, также посмотрите на встроенную функцию enumerate (). Документацию можно найти здесь .

Способ, которым вы могли бы закодировать свое решение, используя перечисление, было бы:

for i, res in enumerate(results_histogram):
    url+=res
    if i != len(results_histogram)-1:
       url+=','

Предполагая, что url объявлен где-то ранее. Опять же, лучше использовать join для вашей ситуации.просто показывает вам перечисление для будущих ситуаций, когда вы можете захотеть сделать что-то кроме конкатенации строк.

1 голос
/ 04 августа 2010

Использование переменной для увеличения списка обычно не требуется. Срез вернет все, кроме последнего элемента.

Этот пример соответствует вашему синтаксису:

for el in results_histogram[:-1]:
    url += str(el) + ','

Или вы можете завершить все это с помощью выражения генератора:

','.join(str(el) for el in results_histogram[:-1])
1 голос
/ 04 августа 2010

Марк, безусловно, подходит для вашего примера, но иногда такие случаи случаются, когда такой элегантной альтернативы не существует.Тогда вы можете сделать что-то вроде:

if len(results_histogram):
    url += str(results_histogram[0])
    for i in range(len(results_histogram))[1:]:
        url += ',' + str(results_histogram[i])
0 голосов
/ 01 июня 2011
ouput = "("
for telem in text[:-1]:
    output += "%s, " % telem 
output += "%s)\n" % text[-1:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...