[python]simple stuff

Makc500

1. Что принято ипользовать вместо select case?
2. Как красиво избавить строку от лишних пробелов? Типа:
"1    2  3       4  5      7" ->(1,2,3,4,5,7)

s507040

2. regexp?

kindr-16

split?
если в итоге нужно именно строку, то
def MakeLookGood(SomeString):
  return '('+''.join([i+',' for i in SomeString.split])[:-1]+')'
не слишком красиво, но работает

nikita270601

def MakeLookGood(SomeString):
return '('+''.join([i+',' for i in SomeString.split])[:-1]+')'
ну ты и жесть написал. Почему не:
def MakeLookGood(SomeString):
return '(' + ','.join(SomeString.split + ')'

tipnote

1) согласно задаче. например, dict.
2) избавить строку от пробелов:
''.join(s.split
А чтобы сделать только то, что ты написал в примере (строка в нестроковый sequence): просто s.split+преобразование в требуемый sequence, если не устраивает list. Правда, там будут строки, а не инты. Чтобы были еще и инты, то что-то вроде:
[int(i) for i in s.split]

tipnote

Ты, сцуко, разлюбил форматные строки, что ли?

nikita270601

Чо пристал?

kindr-16

так слишком понятно

tipnote

так слишком понятно
гыг, ну, если цель была показать, как можно непонятно писать на питоне - то да. Ведь там же жуткое количество ненужных телодвижений и неиспользованных возможностей

Makc500

Спасибо. Я почему-то думал, что split должен иметь аргумент обязательно.
[int(i) for i in s.split] а это вообще какая-то злая магия ) Где-нибудь можно прочитать про такие фишки?

tipnote

Спасибо. Я почему-то думал, что split должен иметь аргумент обязательно.
Да пожалуйста! Читай документацию повнимательнее просто

Makc500

Да пожалуйста! Читай документацию повнимательнее просто
я это читаю:
http://rgruet.free.fr/PQR2.3.html#stringMethods
а там не был описан эффект от split

tipnote

Гмм. А что не официальная-то?
Типа:
http://www.python.org/doc/2.3.5/lib/lib.html
подставь нужную версию
ЗЫ А что 2.3? Требования проекта?

Makc500

>1) согласно задаче. например, dict.
Ну, например:
x = 1 или 2 или 3
что нужно писать, вместо
if x==1:
smth1
if x==2:
smth2
и т.п.
?

Makc500

неофициальная, т.к. удобно, всё на одной странице
версия 2.5
а где в документации объясняется существование и устройство следующего объекта:
[int(i) for i in s.split]
?

tipnote

http://docs.python.org/tut/node7.html#SECTION007140000000000...
http://docs.python.org/ref/lists.html
там поиск есть (на главной странице документации текущей версии (2.5)- http://docs.python.org/ )

tipnote

if x==1:
smth1
if x==2:
smth2
Зависит от сложности smth* и количества веток, например, если веток больше 3, а smth* это методы, замыкания или лямбды, то так, например:

actions = {
1: smth1,
2: smth2,
...
}
...
actions[actionID]

Но это скорее вопрос 'кому как больше нравится' и скорости (dict частенько будет быстрее if-elif-...-else)

Makc500

smth = три команды принт:

if data[0]=='501':
print( 'Door_stop_link_1-1.6 ,1,1, '+data[2] )
print( 'Door_stop_link_1-1.6 ,2,2, '+data[3] )
print( 'Door_stop_link_1-1.6 ,3,3, '+data[4] )

if data[0]=='502':
print( 'Door_stop_link_2-1.1 ,1,1, '+data[2] )
print( 'Door_stop_link_2-1.1 ,2,2, '+data[3] )
print( 'Door_stop_link_2-1.1 ,3,3, '+data[4] )

........

tipnote

Если веток много, то я бы сделал замыкания или методы на эти smth*, то бишь принты, и словарь, как уже говорил.
Если веток мало, то оставил бы if-elif-else

Makc500

		tmp=line.lstrip.split(' ')[0]
if tmp.isdigit and int(tmp)>500 and int(tmp)<535:
data=line.split
if data[0]=='501':
print( 'Door_stop_link_1-1.6 ,1,1, '+data[2] )
print( 'Door_stop_link_1-1.6 ,2,2, '+data[3] )
print( 'Door_stop_link_1-1.6 ,3,3, '+data[4] )

if data[0]=='502':
print( 'Door_stop_link_2-1.1 ,1,1, '+data[2] )
print( 'Door_stop_link_2-1.1 ,2,2, '+data[3] )
print( 'Door_stop_link_2-1.1 ,3,3, '+data[4] )

if data[0]=='503':
print( 'Door_stop_link_3-1.4 ,1,1, '+data[2] )
print( 'Door_stop_link_3-1.4 ,2,2, '+data[3] )
print( 'Door_stop_link_3-1.4 ,3,3, '+data[4] )


if data[0]=='504':
print( 'Uplock_support_links-2.1 ,1,1, '+data[2] )
print( 'Uplock_support_links-2.1 ,2,2, '+data[3] )
print( 'Uplock_support_links-2.1 ,3,3, '+data[4] )


if data[0]=='505':
print( 'Uplock_support_links-1.1 ,1,1, '+data[2] )
print( 'Uplock_support_links-1.1 ,2,2, '+data[3] )
print( 'Uplock_support_links-1.1 ,3,3, '+data[4] )


if data[0]=='506':
print( 'Assembly.16 ,1,1, '+data[2] )
# print( 'Assembly.16 ,2,2, '+data[3] )
print( 'Assembly.16 ,3,3, '+data[4] )


if data[0]=='507':
print( 'Assembly.17 ,1,1, '+data[2] )
print( 'Assembly.17 ,2,2, '+data[3] )
print( 'Assembly.17 ,3,3, '+data[4] )

if data[0]=='531':
print( 'Assembly.10002 ,1,1, '+data[2] )
print( 'Assembly.10002 ,2,2, '+data[3] )
print( 'Assembly.10002 ,3,3, '+data[4] )

if data[0]=='532':
print( 'Assembly.10001 ,1,1, '+data[2] )
print( 'Assembly.10001 ,2,2, '+data[3] )
print( 'Assembly.10001 ,3,3, '+data[4] )

if data[0]=='533':
print( 'Assembly.10003 ,1,1, '+data[2] )
print( 'Assembly.10003 ,2,2, '+data[3] )
print( 'Assembly.10003 ,3,3, '+data[4] )


if data[0]=='534':
print( 'Assembly.5 ,1,1, '+data[2] )
print( 'Assembly.5 ,2,2, '+data[3] )
print( 'Assembly.5 ,3,3, '+data[4] )

tipnote


def gogogo(data):
def printStupidError:
print( 'Door_stop_link_1-1.6 ,1,1, %s'%data[2] )
print( 'Door_stop_link_1-1.6 ,2,2, %s'%data[3] )
print( 'Door_stop_link_1-1.6 ,3,3, %s'%data[4] )
def printCrazyBoobsError:
print( 'Door_stop_link_2-1.1 ,1,1, %s'%data[2] )
print( 'Door_stop_link_2-1.1 ,2,2, %s'%data[3] )
print( 'Door_stop_link_2-1.1 ,3,3, %s'%data[4] )
...
errPrinters = {
'501': printStupidError,
'502': printCrazyBoobsError,
}
...
errPrinters[data[0]]

но вообще, если пример дословный:

stupidError = """
Door_stop_link_1-1.6 ,1,1, %s
Door_stop_link_1-1.6 ,2,2, %s
Door_stop_link_1-1.6 ,3,3, %s"""

crazyBoobsError = """
Door_stop_link_2-1.1 ,1,1, %s
Door_stop_link_2-1.1 ,2,2, %s
Door_stop_link_2-1.1 ,3,3, %s"""
...
def gogogo(data):
errMessages = {
'501': stupidError,
'502': crazyBoobsError,
}
...
print errMessages[data[0]]%tuple(data[2:5])

tipnote

А совсем в идеале импортил бы эти строки из отдельного модуля или грузил из ресурса.

tipnote

ну да, я бы делал форматные строки, как в варианте два.
Только раз у тебя там комментарий затесался в теле 506, то использовал бы именованные параметры:
"""something %(where)s
something %(what)s""" % {'where':data[2], 'what':data[3],...}

Makc500

А такой корявый код можно как-нибудь упростить?
				tmp2=[]
for item in tmp:
try:
if fabs(float(item>50:
tmp2.append(float(item
else:
tmp2.append(0)
except:
tmp2.append(item)

tipnote

Поясни сначала, пожалуйста, как(ое)ие исключени(е)я ты ловишь. Вообще, не слишком хорошо использовать отлов 'всех' исключений в местах, где подразумеваются одно-два и логика отличная от отчета об ошибках/перезапуска модуля. Хотя бы потому, что читабельность понижается. Вот я сейчас, к примеру, ломаю голову, почему ты в список кладешь либо нуль, либо float(item а поймав исключение, пользуешься просто item, хотя исключения тут либо по памяти, либо от преобразования в float. И строю кучу предположений вместо конструктива...

Makc500

извиняюсь. исключение: если item — не число
остальное, по идее, понятно

kindr-16

 
tmp2=map(lambda x: (float(x) if (fabs(float(x > 50) else 0) if type(x) in (int, float) else x, tmp)

нате вам ещё кусок гавнокода =)

vall

гавнокода кусок
воистину! на первом же не_числе словит эксепшн.

kindr-16

сфигабы?

vall

ладна, эксепшена не будет, т.к. float никогда не вызовется ни для одной str

Makc500

о, клёво

kindr-16

э-э-э! стоять, не делать резких движений!
оно работает не так, как твой кусок кода
и вообще, это был пример как писать не стоит

tipnote

Понятно. А item может быть числом, сериализованным в строку? Если да, то я бы только вот этот кусок:

if fabs(float(item>50:
tmp2.append(float(item
else:
tmp2.append(0)

заменил бы на:

fItem = float(item)
tmp2.append(fItem if fabs(fItem)>50 else 0)

а остальное не трогал.

tipnote

Слушай, а просто интересно, какая задача вообще стоит? Откуда появляется работа с такими неоднородными списками? И она никак не сводится к работе с однородными?
Просто это же в каждом проходе (наверняка ниже есть еще одна обработка нового списка, иначе нафиг преобразовывать в float?) по списку придется делать ветвление/ловить эксепшены из-за неоднородности

vall

у меня такой-же трэш возникал в кодогенераторе, когда смещения были частично константами и соответственно частично вычислялись при генерации. хотя от неоднородности я в итоге избавился, ибо гемор.
вообще удивительно что нет {float,int,etc}(string, default)

tipnote

вообще удивительно что нет {float,int,etc}(string, default)
Мб есть какие-то заморочки. Интересно, PEP был похожий когда-нибудь...
Или решили, что обернуть легко руками, следовательно не нужно усложнять текущий вариант.
Или никто не жаловался

vall

да текущий вариант не так уж и плох. это скорее проблема ограниченности lambda выражений.

tipnote

да текущий вариант не так уж и плох. это скорее проблема ограниченности lambda выражений.
Вот уж за что я всегда был двумя руками (несмотря на всю свою 'питонутость') - так это за лябду, поддерживающую statement (хер с ними с multi-statement - я им не вижу нормального применения, но statement нужен). А то серьезно задалбывает иногда.

tipnote

Мне тут намекнули, что я написал хню
Короче, подразумевался 'однострочный statement', а не statement в нормальном понимании

Makc500

задача - парсить файл

garikus


def c (x):
try:
x1 = float(x)
except ValueError:
return x
else:
if fabs(x1) > 50:
return x1
else:
return 0

...

tmp2 = map(c, tmp) # tmp2 = [ c(i) for i in tmp ]

Makc500

как убрать принудительный перевод на новую строку в результате команды
print var
var type is float, допустим
?

banderon


To make print suppress its usual trailing newline, add a comma to the end of the statement:
print "Foo",
print "Foo %s" % (bar

Makc500

круто!
как узнать индекс (порядковые номер) слова в словаре?

Makc500

короче, это нужно, чтобы перебрать все неповторяющиеся неупорядоченые пары слов из словаря

Makc500

короче, открыл для себя enumerate

Makc500


data += tmp2[1:len(tmp2)+1]
if len(tmp2)<5: data += [0,0,0,]

В data надо добавлять 6 чисел из tmp2, причем, если в tmp2 только 3 числа, остальное забивать нулями.
tmp2 = [нечто, n1, n2, n3]
или
tmp2=[нечто, n1, n2, n3, n4, n5,n6]
Нормально как это должно выглядеть?

Makc500

как пройти по всем файлам в каталоге ?
следующее, вроде, еще и в подкатологи заглядывает

for files in os.walk(path):
for file in files[2]:

tipnote


data += tmp2[1:] + [0]*(7-len(tmp2

tipnote


[f for f in os.listdir(path) if os.path.isfile(f)]

?

Makc500


[f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f]

а если просто нужно в цикле по названиям пройти, не создавая списка файлов?

Makc500

аццкий язык

tipnote

code:
[f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f]
Ну да, я для текущей директории написал. Также, для текущей можно было написать:

...for f in filter(os.path.isfile, os.listdir(path...

А для не текущей директории я бы filter не использовал, ибо длинновато и сложновато, имхо.
а если просто нужно в цикле по названиям пройти, не создавая списка файлов?

А listdir что вернет? Напиши себе куда-нибудь в utils.py

def listfiles(path):
return [...]
...
for f in utils.listfiles(path):
...

Один фиг пригодится еще где-нибудь...
Либо 'в лоб' пиши. Ну появится лишний уровень вложенности, ну и фиг, возможно.
ЗЫ Я сейчас не в кондиции думать, так что может кто что лучше напишет

Makc500

а в питоне как-нить предусмотрено 1ой строчкой следующее писать:

for x in y:
if x in some_condition:

tipnote

аццкий язык
Если по поводу

[0]*(7-len(tmp2

то мб ради 'вкуривания потомками слету' 7-len(tmp2) стоит вынести в нормально именованную переменную. И конструкция []* упростится, и станет ясно 'что за семерки и ваще, че это?'

tipnote

Хмм, я же, вроде, написал про filter. Это примерно то, что нужно в таких случаях, если не приходится писать сложную/длинную лямбду и не нужно судорожно экономить память.

Makc500

ок
т.е.
for x in y if x in some_condition
корректно только в контексте
[x for x in y if x in some_condition]
но не в качестве цикла
?

Makc500

потомков не предвидется )

tipnote

т.е.
for x in y if x in some_condition
корректно только в контексте
[x for x in y if x in some_condition]
но не в качестве цикла
ага

Makc500

чото я затупитлся в конец, как поячеечнро складывать списки чисел?
(a,b (c,d) --> (a+c,b+d)

vall

map(operator.add, (a, b (c, d

Makc500

а мне приснилось, что их можно было как-то просто складывать/вычитать без map?

vall

встроенных векторов вроде нет, только complex
сам пиши или используй готовые Scientific.Geometry.Vector

Makc500

если открыть файл и пройтись по строкам по средствам
f = open (..)
for line in f:

то как внутри цикла перейти к следующей строчке?

psihodog

f.next
Оставить комментарий
Имя или ник:
Комментарий: