Форум сайта python.su
0
Есть лист 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)
Офлайн
25
#-*- 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)
Офлайн
857
#!/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
Офлайн
0
Спасибо за примеры, но я хочу понять что у меня нетак. Пытался сделать максимально просто(хоть и криво): перебором, проверяя есть ли нужное значение.
Но while либо не выполняется ниразу, либо зацикливается.
Офлайн
5
to asdf
То что ты пишешь бред какой то, конечно он будет зацикливаться. По поводу твоей ошибки, если пишет что нет в последовательности значения, то так оно и есть. Ты б точнее задал входную строку то хотя б. Вдруг у тебя на входе
а рандом у тебя выдал 9, вот в списке и нет значения “_9_”
Народ ж вам посоветовал, куда уж легче то )
PS я на ваш код минут 20 смотрел пытался понять что он делает. но так и не понял ). Если вам надо тупо перебрать последовательность и заменить ВСЕ элементы, то вам уже помогли. А если любые 3 элемента в последовательности то так и формулируйте.
PSS изучайте стандартную библиотеку, чтоб не писать такой обкуренные бред
Офлайн
0
Я же новичок, конечно бред.
Строка вида
Если выпадет _9_ то цикл будет крутится дальше пока не выпадет 1 или 2 ил 3 которые превратятся потом в “_1_|” или “_2_|” или “_3_|” которые есть в массиве. Именно для этого мне и нужен while.
Мне нужно найти, а потом заменить один любой елемент с цифрой, на “_0_|”.
Piton23Спасибо тем кто помог, я учусь. Если копипастить рабочий код толку не будет.
Народ ж вам посоветовал, куда уж легче то )
Офлайн
857
учись описывать словами
1. пока не найден элемент для замены:
1.1 взять элемент
1.2 проверить его на соответствие
1.2.1 левую часть
1.2.2 середину
1.2.3 правую часть
1.3 если элемент подходит, заменить его
искать элемент для замены
взять элемент
проверить элемент
разделить его на части
левая
средняя
правая
в левой части должно быть "_"
в средней части должна быть цифра
в правой части должно быть "_|"
если элемент подходит
заменить его на "_O_|"
Офлайн
5
Если вам нужно заменить значения не смотря на порядок, то лучше ж последовательно перебирать, чем использовать рандом с бесконечным циклом. Если уж вам так обязательно нужно использовать рандом, то используйте try/except, чтоб отловить ошибку и перейти на следующую итерацию, но это ж будет медленнее и не эффективней.
PS: Да вы не обижайтесь, все когда то начинали, просто плохой подход и код надо сразу пресекать, а то потом переучиваться будет сложновато. )
Офлайн