Форум сайта python.su
EdА вот так:
Интересно было бы увидеть ваше решение.
import random
rand = random.randint
randch = random.choice
arr = []
def generate(KolSymb):
def Dvoetoch():
i = rand(2,3)
for j in range(i):
k = rand(0,KolSymb)
arr[k] = ":"
for i in range(KolSymb+1):
arr.append(randch("abcdefghigklmnopqrstuvwxyz"))
Dvoetoch()
print arr
Офлайн
UsCrМожно намного проще. И мы это скоро увидим, если хотите.
Думаю, можно ещё проще.
Но на самом деле, это только часть задачи.Предлагаю сделать сначала эту часть, чтобы вы ощутили мощь языка.
Офлайн
Edпримерно так:
Жду результата
import random
import string
def generate(KolSymb):
arr = random.sample(string.letters,KolSymb)
for i in range(random.randint(1,2)):
arr[random.randint(0,KolSymb)] = ":"
return arr
def go(Kol):
print generate(Kol)
Отредактировано (Ноя. 6, 2009 10:54:29)
Офлайн
UsCrrandom.sample выдаст ошибку, если KolSymb > len(string.letters)Edпримерно так:
Жду результатаПохоже?import random
import string
def generate(KolSymb):
arr = random.sample(string.letters,KolSymb)
for i in range(random.randint(1,2)):
arr[random.randint(0,KolSymb)] = ":"
return arr
def go(Kol):
print generate(Kol)
Офлайн
Dimka665Угу, хорошо. Можете сравнить с вашим вариантом в начале этого треда и восхититься :)
примерно так:
Отредактировано (Ноя. 6, 2009 12:15:39)
Офлайн
Ed
Если sample не работает как нужно, то либо сделайте проверку, либо не юзайте вообще. Просто так оставлять нельзя.
Если random.randint(0, KolSymb) вернет вам KolSymb, то получите IndexError.
import random
import string
def generate(KolSymb):
if KolSymb > 147: KolSymb = 147
arr = random.sample(string.letters,KolSymb)
for i in range(random.randrange(1,2)):
arr[random.randrange(0,KolSymb)] = ":"
return arr
def go(Kol):
print generate(Kol)
Офлайн
UsCrТак совсем плохо. Но даже if KolSymb > len(string.letters) мне кажется не очень хорошим решением.
if KolSymb > 147: KolSymb = 147
Офлайн
EdНе очень понимаю я о создании генераторов списков…
Лучше замените random.sample на однострочный list comprehension на основе random.choice.
res = [x for x in xrange(1, 25, 2)]
print res
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23]
Офлайн
UsCrАналогично вот этому:
Не очень понимаю я о создании генераторов списков…Как это работает?res = [x for x in xrange(1, 25, 2)]
print res
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23]
res = []
for x in xrange(1, 25, 2):
res.append(x)
print res
И почему if KolSymb > 147: KolSymb = 147 - это очень плохоЭто плохо, потому что непонятно что такое 147. Код менее читабелен.
, а if KolSymb > len(string.letters) - не очень хорошо?Не только if KolSymb > len(string.letters), а еще и KolSymb = len(string.letters).
Отредактировано (Ноя. 6, 2009 18:20:39)
Офлайн
Напомню условие задачи:
Даны натуральное число n и символы s1, …, sn среди которых есть двоеточие.
а) Получить все символы расположенные до первого двоеточия включительно.
б) Получить все символы расположенные после первого двоеточия.
в) Получить все символы, расположенные между первым и вторым двоеточием. Если второго двоеточия нет, то получить все символы, расположенные после единственного имеющегося двоеточия.
Итак, вот мой вариант решения первого пункта:
from random import randrange
from string import letters
def generate(KolSymb):
arr = [string.letters[random.randrange(0,len(string.letters))] \
for i in xrange(0,KolSymb)]
for i in range(random.randrange(2,3)):
arr[random.randrange(0,KolSymb)] = ":"
return arr
def first(Kol): #Punkt "a"
arr = generate(Kol)
xarr=[]
print arr
if arr[0]==":":print "Array is empty"
else:
for i in range(0,len(arr)):
xarr.append(arr[i])
if arr[i]==":":break
return xarr
for i in range(random.randrange(2,3)):
arr[random.randrange(0,KolSymb)] = ":"
for i in range(0,len(arr)):
xarr.append(arr[i])
if arr[i]==":":break
xarr = [arr[i] for i in range(0,len(arr)) if arr[i]!=":"]
xarr = [arr[i] for i in range(0,len(arr)) if arr[i]!=":" else:break]
Отредактировано (Ноя. 6, 2009 21:31:45)
Офлайн