Уведомления

Группа в Telegram: @pythonsu

#1 Июль 14, 2012 16:06:03

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Индекс в списке

Ну и немного извращения:

print '\n'.join("kg: %s %s and %s" % item for item in zip(kg, fruits, fruits2) if item[0].isdigit() and int(item[0]) >= 5 )



Офлайн

#2 Июль 14, 2012 16:26:19

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Индекс в списке

odnochlen
fata1ex
except: pass

Так писать нельзя.
Нельзя-то нельзя, но не подскажешь ли, как получить список всех возможных исключений, которые может бросить код?
Если очень нужно поймать почти все исключения, лучше ловить Exception, потому что выше него только SystemExit, KeyboardInterrupt и GeneratorExit.

http://docs.python.org/library/exceptions.html#exception-hierarchy

Офлайн

#3 Июль 14, 2012 16:40:29

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Индекс в списке

В этом конкретном случае так делать нельзя, потому что:

>>> a = [1,2,3]
>>> a.index(4)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: 4 is not in list
>>> a[3]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: list index out of range
Возможны сразу два исключения, которые мы поймаем и замнём, вовсе того не желая.



Отредактировано fata1ex (Июль 14, 2012 16:40:49)

Офлайн

#4 Июль 14, 2012 20:47:42

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Индекс в списке

Ed
И я хочу поучаствовать в конкурсе телепатов. Претендую на первое место
fruits = ['Apricot', 'Avocado', 'Pawpaw', 'Quince', 'Pineapple', 'Orange', 'Banana', 'Bergamot', 'Grape', 'Cherry', 'Pomegranate']
fruits2 = ['Grapefruit', 'Pear', 'fruits', 'Guava', 'Jackfruit', 'Durian', 'Melon; cantaloupe', 'Fig' 'Calamondin', 'Kaffir lime', 'Cashew', 'Kiwi']
kg = ['10','4','10','6','13','1','13','36:7','10','20:10', '4']
for kgs, fr1, fr2 in zip(kg, fruits, fruits2):
    try:
        if int(kgs) >= 5:
            print 'kg:', kgs, fr1, 'and', fr2
    except ValueError:
        continue

Вы действительно занимаете первое место, а так же получаете титул терпимости к новичкам. Остальным желаю приятных выходных и выражаю своё почтение. Пойду изучать данный код(новая для меня функция zip).
P.s. А можно ли в условие вставить диапазон: от 5 до 7, как пример?

Офлайн

#5 Июль 14, 2012 21:23:14

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Индекс в списке

paraman
P.s. А можно ли в условие вставить диапазон: от 5 до 7, как пример?
Как пример … легко!:
print '\n'.join("kg: %s %s and %s" % item for item in zip(kg, fruits, fruits2) if item[0].isdigit() and 5<=int(item[0])<=7)



Отредактировано Ed (Июль 14, 2012 21:23:56)

Офлайн

#6 Июль 14, 2012 22:17:51

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Индекс в списке

Ed
paraman
P.s. А можно ли в условие вставить диапазон: от 5 до 7, как пример?
Как пример … легко!:
print '\n'.join("kg: %s %s and %s" % item for item in zip(kg, fruits, fruits2) if item[0].isdigit() and 5<=int(item[0])<=7)

Вы способны уничтожить мой мозг. Я ещё не дошёл до уровня такой оптимизации кода. (в строчку писать то, что занимает пару строк. Пока не способен его читать) А можно, как прежде?:

fruits = ['Apricot', 'Avocado', 'Pawpaw', 'Quince', 'Pineapple', 'Orange', 'Banana', 'Bergamot', 'Grape', 'Cherry', 'Pomegranate']
fruits2 = ['Grapefruit', 'Pear', 'fruits', 'Guava', 'Jackfruit', 'Durian', 'Melon; cantaloupe', 'Fig' 'Calamondin', 'Kaffir lime', 'Cashew', 'Kiwi']
kg = ['10','4','10','6','13','1','13','36:7','10','20:10', '4']
for kgs, fr1, fr2 in zip(kg, fruits, fruits2):
    try:
        if int(kgs) >= 5:
            print 'kg:', kgs, fr1, 'and', fr2
    except ValueError:
        continue

P.s. На тему сокращения кода(оптимизации), а можно ли как-то сократить, а то есть кусок кода, где после удовлетворения условия приходится писать такие портянки
minute.remove(m)
hour.remove(h)
second.remove(s)
year.remove(y)
и
minute = []
hour = []
second = []
year = []

Офлайн

#7 Июль 14, 2012 22:28:07

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Индекс в списке

paraman
А можно, как прежде?:
Так пойдет?
fruits = ['Apricot', 'Avocado', 'Pawpaw', 'Quince', 'Pineapple', 'Orange', 'Banana', 'Bergamot', 'Grape', 'Cherry', 'Pomegranate']
fruits2 = ['Grapefruit', 'Pear', 'fruits', 'Guava', 'Jackfruit', 'Durian', 'Melon; cantaloupe', 'Fig' 'Calamondin', 'Kaffir lime', 'Cashew', 'Kiwi']
kg = ['10','4','10','6','13','1','13','36:7','10','20:10', '4']
for kgs, fr1, fr2 in zip(kg, fruits, fruits2):
    if kgs.isdigit() and 5<=int(kgs)<=7:
        print 'kg:', kgs, fr1, 'and', fr2


P.s. На тему сокращения кода(оптимизации), а можно ли как-то сократить, а то есть кусок кода, где после удовлетворения условия приходится писать такие портянки
Можно. Только нужен код и отдельная тема.



Офлайн

#8 Июль 14, 2012 23:08:50

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Индекс в списке

Ed
paraman
А можно, как прежде?:
Так пойдет?
fruits = ['Apricot', 'Avocado', 'Pawpaw', 'Quince', 'Pineapple', 'Orange', 'Banana', 'Bergamot', 'Grape', 'Cherry', 'Pomegranate']
fruits2 = ['Grapefruit', 'Pear', 'fruits', 'Guava', 'Jackfruit', 'Durian', 'Melon; cantaloupe', 'Fig' 'Calamondin', 'Kaffir lime', 'Cashew', 'Kiwi']
kg = ['10','4','10','6','13','1','13','36:7','10','20:10', '4']
for kgs, fr1, fr2 in zip(kg, fruits, fruits2):
    if kgs.isdigit() and 5<=int(kgs)<=7:
        print 'kg:', kgs, fr1, 'and', fr2


P.s. На тему сокращения кода(оптимизации), а можно ли как-то сократить, а то есть кусок кода, где после удовлетворения условия приходится писать такие портянки
Можно. Только нужен код и отдельная тема.

Так по теме же:

fruits = ['Apricot', 'Avocado', 'None', 'Quince', 'Pineapple', 'Orange', 'Banana', 'Bergamot', 'Grape', 'Cherry', 'None']
fruits2 = ['Grapefruit', 'Pear', 'fruits', 'Guava', 'Jackfruit', 'Durian', 'Melon; cantaloupe', 'Fig' 'Calamondin', 'Kaffir lime', 'Cashew', 'Kiwi']
kg = ['10','4','10','6','13','1','13','36:7','10','20:10', '4']
for fr1, fr2, kgs in zip(fruits, fruits2, kg):
    try:
	if fr1 == 'None':
		fruits.remove(fr1)
		fruits2.remove(fr2)
		kg.remove(kgs)
    except ValueError:
        continue

И всё же не понимаю логику. Магия какая-то. Функция zip объединяет массивы(или же преобразует их вид в другой вид), затем мы преобразуем массив kgs в int и производим сравнение. Как же он потом вытаскивает индексы, да ещё и потом вытаскивает значения из других массивов с теми же индексами.
Чтобы было понятней:

kg = ['10','4','10','6','13','1','13','36:7','10','20:10', '4']
f = zip(kg)
print f
[('10',), ('4',), ('10',), ('6',), ('13',), ('1',), ('13',), ('36:7',), ('10',), ('20:10',), ('4',)]
int(f[1])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'tuple'
>>> int(kg[1])
4

и другой эксперимент
>>> a = [66.25, 333, 333, 1, 1234.5]
>>> zip(a)
[(66.25,), (333,), (333,), (1,), (1234.5,)]
>>> a1 = zip(a)
>>> a1.index(333)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 333 is not in list
>>> a.index(333)
1
>>>

Если нет желания объяснять, можно дать ссылку, где я смогу найти эту самую логику, а то под вечер уже хреново пользуюсь гуглом.

Офлайн

#9 Июль 14, 2012 23:25:45

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Индекс в списке

Забудьте про индексы. Это не Си, а Питон. В нем есть гораздо более мощные средства для работы с последовательностями.

Насчет удаления. Я не понимаю зачем удалять. Это только кусок кода, который никак не показывает необходимость удаления.

Насчет непонимания zip. Вы посмотрите что возвращает zip(kg, fruits, fruits2). Индексы здесь не нужны, это группировка элементов трех последовательностей в последовательность из троек. По-моему все очень просто.



Офлайн

#10 Июль 14, 2012 23:27:34

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Индекс в списке

paraman, возьмите любой учебник и прочитайте хотя бы первые пару сотен страниц. Лутц, Саммерфилд, Пилгрим. Это абсолютная база, которая расписана людьми специально для обучения. Без её понимания далеко не уйти.

Фразы вроде

paraman
мы преобразуем массив kgs в int и производим сравнение. Как же он потом вытаскивает индексы, да ещё и потом вытаскивает значения из других массивов с теми же индексами.
выдают, что вы этой базой не владеете, а значит нужно её приобретать.
.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version