выполните итерацию по двум спискам, используя цикл while вместо цикла for

#python #for-loop #while-loop

Вопрос:

 colours = ["red", "green", "blue"]
clothes = ["shirt", "dress", "pants", "jacket", "hat"]


for colour_item in colours:
    for clothes_item in clothes:
        print("I am wearing a ",colour_item," ",clothes_item)
 

Это код, который я пытаюсь изменить в циклы while, чтобы получить все результаты, т. Е. 15 результатов, лучшее, что я могу получить с циклами while, — это 3.

Комментарии:

1. Почему вы хотите использовать для этого цикл while?

2. Включите свой код цикла while.

Ответ №1:

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

 colours = ["red", "green", "blue"]
clothes = ["shirt", "dress", "pants", "jacket", "hat"]

colorIndex = 0
while(colorIndex < len(colours)):
  clothesIndex = 0
  while(clothesIndex < len(clothes)):
    print("I am wearing a",colours[colorIndex],clothes[clothesIndex])
    clothesIndex  = 1
  colorIndex  = 1
 

Выход:

 I am wearing a red shirt
I am wearing a red dress
I am wearing a red pants
I am wearing a red jacket
I am wearing a red hat
I am wearing a green shirt
I am wearing a green dress
I am wearing a green pants
I am wearing a green jacket
I am wearing a green hat
I am wearing a blue shirt
I am wearing a blue dress
I am wearing a blue pants
I am wearing a blue jacket
I am wearing a blue hat
 

Ответ №2:

Если вы готовы немного посчитать, вы можете сделать это за один while цикл.

 colours = ["red", "green", "blue"]
clothes = ["shirt", "dress", "pants", "jacket", "hat"]

n = 0
l = len(clothes)

while n < len(colours) * len(clothes):
    print(f"I am wearing a {colours[n // l]}  {clothes[n % l]}")
    n  = 1
 

Который выводит ожидаемое:

 I am wearing a red  shirt
I am wearing a red  dress
I am wearing a red  pants
I am wearing a red  jacket
I am wearing a red  hat
I am wearing a green  shirt
I am wearing a green  dress
I am wearing a green  pants
I am wearing a green  jacket
I am wearing a green  hat
I am wearing a blue  shirt
I am wearing a blue  dress
I am wearing a blue  pants
I am wearing a blue  jacket
I am wearing a blue  hat
 

Комментарии:

1. Я не думаю, что это более эффективно, хотя, это все еще O(n^2)

2. @AnikethMalyala учитывая, что ОП хочет печатать m * n предметы O(n * m) , кажется, что победить невозможно. Это довольно четко выражено в цикле len(colours) * len(clothes)

3. О(м*н), моя вина. Я думал, вы намекаете, что ваш единственный цикл while был более эффективным, чем вложенные, мой плохой!

4. @AnikethMalyala Я понимаю, как это выглядело. Но нет, просто делаю код короче (но, возможно, не более понятным). Лично я думаю for , что циклы или itertools.product являются правильным способом сделать это.

5. Fr, использование a для каждой петли в этом случае намного лучше

Ответ №3:

 colours = ["red", "green", "blue"]
clothes = ["shirt", "dress", "pants", "jacket", "hat"]

i=0
while i<len(colours):
    j=0
    colour_item = colours[i]
    while j<len(clothes):
        clothes_item = clothes[j]
        print("I am wearing a ",colour_item," ",clothes_item)
        j =1
    i =1