Найти - Пользователи
Полная версия: Цикл while
Начало » Python для новичков » Цикл while
1
asdf
Есть лист f с елементами вида “_6_|” и “_X_|”.
Функция seto должна заменить елемент вида “_6_|” на “_О_|”. Вместо 6 может быть число в диапазоне 1-9, повторяющихся нет.
def seto(f):
h = 8 # любое начальное значение для сравнения в while (больше подходит do while но тут такого нет)
while (h in f != True): # проверка, есть ли нужная строка в массиве
import random
y = random.randint(1,9) # получаем случайное число
n = y # копирую чтобы сохранить число(оно нужно для вставки), а копию преобразовать в строку
h = "_" + str(n) + "_|" # преобразовую в строку

f.remove(h) # удаляю строку из массива
f.insert(y,"_O_|") # на её место вставляю "_0_|"
print "".join(f)
Если вставить оператор print после while, то видно что постоянно выводятся строки вида “_6_|”
Или ошибка в f.remove(h) (удаление несуществующего елемента)

Помогите пожалуйста разобратся в чем тут дело.
s0rg
#-*- coding: utf8 -*-

import random

def fill_strange_list():
l = ['_%d_|' % i for i in xrange(1,10)] + ['_X_|' for _ in xrange(1,10)]
random.shuffle(l)
return l

def seto(f):
return ''.join(map(lambda a: a if a.strip('_|') == 'X' else '_O_|', f))

f = fill_strange_list()

print 'Before: %s' % ''.join(f)
print 'After : %s' % seto(f)
py.user.next
#!/usr/bin/env python
# -*- coding: utf-8 -*-

lst = ["_1_|", "_X_|", "_2_|", "_X_|", "_3_|", "_X_|"]
for ind, i in enumerate(lst):
if i.startswith('_') and i.endswith('_|') and i[1].isdigit():
lst[ind] = '_O_|'
print lst
asdf
Спасибо за примеры, но я хочу понять что у меня нетак. Пытался сделать максимально просто(хоть и криво): перебором, проверяя есть ли нужное значение.
Но while либо не выполняется ниразу, либо зацикливается.
Piton23
to asdf

То что ты пишешь бред какой то, конечно он будет зацикливаться. По поводу твоей ошибки, если пишет что нет в последовательности значения, то так оно и есть. Ты б точнее задал входную строку то хотя б. Вдруг у тебя на входе
а рандом у тебя выдал 9, вот в списке и нет значения “_9_”

Народ ж вам посоветовал, куда уж легче то )

PS я на ваш код минут 20 смотрел пытался понять что он делает. но так и не понял ). Если вам надо тупо перебрать последовательность и заменить ВСЕ элементы, то вам уже помогли. А если любые 3 элемента в последовательности то так и формулируйте.

PSS изучайте стандартную библиотеку, чтоб не писать такой обкуренные бред
asdf
Я же новичок, конечно бред.
Строка вида
Если выпадет _9_ то цикл будет крутится дальше пока не выпадет 1 или 2 ил 3 которые превратятся потом в “_1_|” или “_2_|” или “_3_|” которые есть в массиве. Именно для этого мне и нужен while.
Мне нужно найти, а потом заменить один любой елемент с цифрой, на “_0_|”.
Piton23
Народ ж вам посоветовал, куда уж легче то )
Спасибо тем кто помог, я учусь. Если копипастить рабочий код толку не будет.
py.user.next
учись описывать словами
1. пока не найден элемент для замены:
1.1 взять элемент
1.2 проверить его на соответствие
1.2.1 левую часть
1.2.2 середину
1.2.3 правую часть
1.3 если элемент подходит, заменить его

искать элемент для замены
взять элемент
проверить элемент
разделить его на части
левая
средняя
правая
в левой части должно быть "_"
в средней части должна быть цифра
в правой части должно быть "_|"
если элемент подходит
заменить его на "_O_|"
Piton23
Если вам нужно заменить значения не смотря на порядок, то лучше ж последовательно перебирать, чем использовать рандом с бесконечным циклом. Если уж вам так обязательно нужно использовать рандом, то используйте try/except, чтоб отловить ошибку и перейти на следующую итерацию, но это ж будет медленнее и не эффективней.

PS: Да вы не обижайтесь, все когда то начинали, просто плохой подход и код надо сразу пресекать, а то потом переучиваться будет сложновато. )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB