Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 14, 2012 21:16:02

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл while

Есть лист 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) (удаление несуществующего елемента)

Помогите пожалуйста разобратся в чем тут дело.



Офлайн

#2 Фев. 14, 2012 22:28:34

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Цикл while

#-*- 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)

Офлайн

#3 Фев. 15, 2012 02:02:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Цикл while

#!/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



Офлайн

#4 Фев. 15, 2012 06:39:46

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл while

Спасибо за примеры, но я хочу понять что у меня нетак. Пытался сделать максимально просто(хоть и криво): перебором, проверяя есть ли нужное значение.
Но while либо не выполняется ниразу, либо зацикливается.



Офлайн

#5 Фев. 15, 2012 08:37:42

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

Цикл while

to asdf

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

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

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

PSS изучайте стандартную библиотеку, чтоб не писать такой обкуренные бред

Офлайн

#6 Фев. 15, 2012 17:50:48

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Цикл while

Я же новичок, конечно бред.
Строка вида
Если выпадет _9_ то цикл будет крутится дальше пока не выпадет 1 или 2 ил 3 которые превратятся потом в “_1_|” или “_2_|” или “_3_|” которые есть в массиве. Именно для этого мне и нужен while.
Мне нужно найти, а потом заменить один любой елемент с цифрой, на “_0_|”.

Piton23
Народ ж вам посоветовал, куда уж легче то )
Спасибо тем кто помог, я учусь. Если копипастить рабочий код толку не будет.



Офлайн

#7 Фев. 15, 2012 23:32:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Цикл while

учись описывать словами
1. пока не найден элемент для замены:
1.1 взять элемент
1.2 проверить его на соответствие
1.2.1 левую часть
1.2.2 середину
1.2.3 правую часть
1.3 если элемент подходит, заменить его

искать элемент для замены
взять элемент
проверить элемент
разделить его на части
левая
средняя
правая
в левой части должно быть "_"
в средней части должна быть цифра
в правой части должно быть "_|"
если элемент подходит
заменить его на "_O_|"



Офлайн

#8 Фев. 16, 2012 04:43:59

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

Цикл while

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

PS: Да вы не обижайтесь, все когда то начинали, просто плохой подход и код надо сразу пресекать, а то потом переучиваться будет сложновато. )

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version