Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 24, 2010 19:16:20

T0M
От:
Зарегистрирован: 2010-04-23
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о грамотности

Задача состоит в том, чтобы определить расположение (индексы в массиве) нужного нам значения в двумерном массиве.
Я решил задачу банально через 2 цикла, пробегаясь по элементам:

#! -*- coding: utf-8 -*-

arr = [, , ]

i = False

for x in xrange(3):
for y in xrange(3):
if arr == 6:
print x, y
i = True
break
if i: break
Проблема в том, что при нахождении нужного нам элемента (значение 6) необходимо завершить оба цикла, для этого была введена переменная i.
Но это быдлокод, т.к. при массиве, скажем, 100к элементов, постоянно проверять переменную i на истину очень накладно.

Вопрос: каким образом можно грамотно выйти из обоих циклов?



Офлайн

#2 Апрель 24, 2010 19:18:04

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопрос о грамотности

Офлайн

#3 Апрель 24, 2010 19:21:10

T0M
От:
Зарегистрирован: 2010-04-23
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о грамотности

например? притягивать сюда своё исключение за уши?



Офлайн

#4 Апрель 24, 2010 19:21:22

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Вопрос о грамотности

Я поступаю так, но не очень мне этот способ по душе:

for x in range(3):
for y in range(3):
if arr[x][y] == 6:
print x, y
break
else:
continue
break
p.s. В данном примере xrange будет несколько расточительнее. Когда-то проверял, тестил, сейчас может это и не так.

..bw



Офлайн

#5 Апрель 24, 2010 19:30:05

T0M
От:
Зарегистрирован: 2010-04-23
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о грамотности

bw, спасибо, невнимательно читаю книги



Офлайн

#6 Апрель 24, 2010 19:55:46

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопрос о грамотности

T0M
например? притягивать сюда своё исключение за уши?
# coding: utf8

arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

try:
for x in range(3):
for y in range(3):
if arr[x][y] == 6:
raise Exception( (x,y) )
except Exception as e:
print e
таким способом можно не только выход из 2-х цыклов сделать но и из 100 и из функции…

Офлайн

#7 Апрель 24, 2010 19:57:29

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопрос о грамотности

кстате можно в функцию завернуть и вызывать return

Офлайн

#8 Апрель 24, 2010 19:58:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вопрос о грамотности

может, тогда уж проще и естественней использовать банальный return?



Офлайн

#9 Апрель 24, 2010 20:00:11

T0M
От:
Зарегистрирован: 2010-04-23
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о грамотности

Сразу же следущий подобный вопрос. Каким образом можно преобразовать двумерный массив к одномерому?
Мой вариант опять же сводится к быдлокоду, т.к. производится операция наполнения

a = [, , ]

out =
for x in xrange(3):
for y in xrange(3):
out.append(a)
o7412369815963, спасибо

Андрей Светлов, сразу за этими двумя циклами идут ещё 3-4 подобных, поэтому return непримени, я уже думал об этом)



Отредактировано (Апрель 24, 2010 20:05:32)

Офлайн

#10 Апрель 24, 2010 20:26:01

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопрос о грамотности

arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for a in arr:
for b in a:
print b

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version