2014-10-23 2 views
0

Я подошел к этому вопросу, который я пытаюсь решить. Он просит меня преобразовать код из «for-loops» в «while-loops» :.Преобразование из «For-Loops» в «While-Loops»

def print_names2(people): 
    for person in people: 
     to_print = "" 
     for name in person: 
      to_print += name + " " 
     print(to_print) 

мне удалось сделать только первую половину:

def print_names2(people): 
    i = 0   
    while i < len(people[i]): 
     print(i) 
     i += 1 

Когда я проверить его с:

print_names2([['John', 'Smith'], ['Mary', 'Keyes'], ['Jane', 'Doe']]) 

Returns:

0 
1 

Может кто-то уточнить мне как это сделать, поскольку я уверен, что мой подход h к ответу немного далеко.

ответ

1

Вы забываете индексировать в people еще раз; вы печатаете только индекс. Вы также хотите, чтобы перебрать все записи в people не только имена в первом подсписком:

def print_names2(people): 
    i = 0   
    while i < len(people): 
     print(people[i]) 
     i += 1 

Это только перебирает внешнего списка. Если вы хотите, чтобы петля над внутренними подсписками добавить второй while цикл:

def print_names2(people): 
    i = 0   
    while i < len(people): 
     j = 0 
     while j < len(people[i]) 
      print(people[i][j]) 
      j += 1 
     i += 1 

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

def print_names2(people): 
    i = 0   
    while i < len(people): 
     to_print = "" 
     j = 0 
     while j < len(people[i]) 
      to_print += people[i][j] + " " 
      j += 1 
     print(to_print) 
     i += 1 

Это теперь ближе к оригинальной версии с for петлями.

Альтернативная версия может создавать копии списков, а затем удалить пункты из этих списков, пока они не пустуют:

def print_names2(people): 
    i = 0   
    while i < len(people): 
     person = list(people[i]) 
     to_print = "" 
     while person: 
      name = person.pop(0) 
      to_print += name + " " 
     print(to_print) 
     i += 1 

Я оставил внешний контур с помощью индекса.

-1

Может быть, вот что вы хотите:

def print_names(people): 
    while people: 
    p = people.pop() 
    n = '' 
    while p: 
     n += p.pop() + ' ' 
    print n 
+0

Вы считаете, что 'people' является списком и опустошает его в процессе. – chepner

0

@ ответ Мартейн работает для теста заданной (последовательность последовательностей имен), но это не так (и, насколько я знаю, никогда не было), эквивалентный оригиналу для кода цикла, который работает с итерабельными итерами имен. Примером последнего, который работает с петлями для но не петель в то время, является

def it_it_names(): 
    yield ['John', 'Smith'] 
    yield ['Mary', 'Keyes'] 
    yield ['Jane', 'Doe'] 

Вот код, а контур, который, по существу, эквивалентно для петель.

def pn_while(people): 
    it = iter(people) 
    try: 
     while True: 
      person = next(it) 
      to_print = "" 
      it2 = iter(person) 
      try: 
       while True: 
        name = next(it2) 
        to_print += name + " " 
      except StopIteration: 
       pass 
      print(to_print) 
    except StopIteration: 
     pass 

pn_while(it_it_names()) 
# prints 
John Smith 
Mary Keyes 
Jane Doe 

До 2,2, эквивалентный контур, а будет использовать индексацию на 0, 1, 2, ... вместо следующего() и поймать IndexError вместо StopIteration. По крайней мере, с 1,4, len() не использовался для остановки цикла.

Возможно, стоит отметить, что корпус внешней петли можно заменить на print(' '.join(person)). Единственное различие заключалось бы в том, чтобы не добавлять пространство в конец.

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