2016-09-27 4 views
3

Я раньше не делал python (только javascript). Я нахожу, что docs-иностранец и другие сообщения stackoverflow на list.pop() еще более загадочны!В списке нет символов?

мои аргументы являются '0','0','0','0','0000'

вот мой код:

i=['.','.','.',':',''] 

host='' 
for v in sys.argv[1:]: 
    host=host+str(v)+str(i.pop()) 
host=host[:-1] 

print host 

Я пытаюсь получить '0.0.0.0:0000'

Но вместо этого я получаю: IndexError: pop from empty list

https://repl.it/DirH/1

Причина, о которой я прошу, заключается в том, что я не могу найти ВОПРОСЫ, где список - это символы и список объявлен в простой форме!

+2

Вы знаете, что 'pop()' тянет от конца, а не от начала, правильно? Если вы хотите начать, попробуйте 'pop (0)'. –

+2

* ", где список является символом, а список объявляется простым письмом!" * - что? Это самые одиночные строки символов, и я думаю, вы пытаетесь описать литерал списка. Это не отличается ** от литерала JS-массива. – jonrsharpe

+0

Да поп тянет с конца (собирался исправить это позже, как только выясню, какие сдвиги с самого начала) –

ответ

2
a=['script','location','00','11','22','33','4444'] 
i=['.','.','.',':','',''] # added an extra '' 

host='' 

for v in a[1:]: 
    host=host+str(v)+i.pop(0) 

print (host) 

Что-то вроде этого? Измененный pop (0) заставляет вас начинать не до конца. Ваша проблема заключалась в том, что вы пытались поп больше, чем было.

+0

мой код беспорядок, но это починил это! –

4

Вы можете положить все, что угодно в списке. Вероятно, ваш sys.argv слишком длинный (даже после отрезания первого элемента).

например. если len(sys.argv[1:]) == 6 и len(i) == 5, чем к тому моменту, когда вы доберетесь до последнего элемента в цикле for, i будет пустым. Это, по-видимому, относится к коду, опубликованному в ссылке.

отметить также, что вы, вероятно, лучше использовать zip:

lst = ['.','.','.',':',''] 
for v, ii in zip(sys.argv[1:], lst): # possibly reversed(i) if you meant to pop off the left side of the list rather than the end? 
    host += host + str(v)+ str(ii) 

Или (более эффективно):

host = ''.join(j+ii for j, ii in zip(sys.argv[1:], lst)) 

Конечно, вы, вероятно, в конечном итоге с неправильным выходом (даже с zip), если входные списки не соответствуют длине. Однако вы не получите исключение, а только более короткую выходную строку, чем вы могли бы ожидать, поскольку zip усекает, когда один из итераций исчерпан.

+1

Или 'host = '' .join (i + j для i, j в zip (sys.argv [1:], lst)) ' –

+0

@ Mr.goosberry - Нет. К сожалению, имя, которое OP использует для списка, это' i'. Может быть, мне нужно просто изменить _all_ имена ради ясности ... – mgilson

+0

@MosesKoledoye - Я пытался идти медленно и не вводил _too_ много сразу. С учетом сказанного, мне довольно сложно оставить ответ, в котором я использую '+ =' для построения строки, поэтому я добавил также версию '.' .join' ... – mgilson

0

Кажется, что вы хотите просто: соедините все, используя точку, но в последней части номер порта должен быть соединен двоеточием. Вот еще один способ сделать это:

port = sys.argv.pop() 
host = '{}:{}'.format('.'.join(sys.argv[1:]), port) 
Смежные вопросы