Python цикл по нескольким переменным

Несколько переменных управления цикла в Python для цикла

Я столкнулся с ситуацией, когда мне нужно реализовать цикл for с более чем одной переменной управления контуром. В основном это то, что я пытаюсь сделать Ява:

for (int i=0,j=n; i=0; i++, j--) do my stuff 
for i in range(0,n), j in range(n-1,-1,-1): do my stuff 

Но это не работает. Какой здесь был бы правильный синтаксис? Кроме того, существует ли более элегантная (пифоническая) конструкция для прецедента?

Да, потому что часто вы можете перебирать фактические элементы, которые вы пытаетесь использовать в цикле, вместо числовых индексов для них.

Нет, i и j не используются для доступа к массивам или чему-либо еще. Это фактические числовые значения, которые мне нужны внутри цикла.

3 ответа

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

for i in range(0, n): j = n-i # do stuff 

В общем случае вы не можете указывать несколько значений в инструкции for если они зависят друг от друга. Вместо этого используйте for для перебора некоторого «базового» значения или значений, из которых могут быть получены другие.

Вы можете указать несколько значений в цикле for , но они должны быть взяты из одного итерабельного:

for i, j in zip(range(0, n), range(n, 0, -1)): # do stuff 

Это берет я из первого диапазона (от 0 до n-1) и j от второго (от n до 1). zip создает новую итерабельность путем покомпонентного сопряжения элементов итераций, которые вы им даете.

Читайте также:  Php not running in browser

Следует помнить, что Python for циклов не похож на циклы в Java/C, которые имеют структуру/состояние завершения инициализации/проверки, которая неоднократно изменяет некоторую переменную индекса постоянного цикла. Python for циклов перебирает «поток» значений, предоставляемых «исходным» итерабельным, захватывая одно значение за раз от источника. (Это похоже на конструкцию foreach -type на некоторых других языках.) Независимо от того, что вы хотите перебрать, вам нужно сделать это в итерабельном, прежде чем вы начнете цикл. Другими словами, каждый цикл Python for можно рассматривать примерно так же, как:

 for (i=iterable.getNextValue(); iterable.isNotEmpty(); i=iterable.getNextValue()) 

Вы не можете иметь инициализацию цикла, отличную от обновления цикла, и вы не можете иметь такую операцию, кроме «получить следующее значение», и вы не можете иметь конечное условие, кроме как «это истребитель исчерпан «. Если вы хотите сделать что-либо подобное, вам нужно либо сделать это самостоятельно в цикле (например, назначив вторичную «переменную цикла», как в моем примере, либо, проверив условие пользовательского цикла выхода и разрыва), или создайте его в «источник», который вы повторяете.

верно, это действительно сработает. но, исходя из фона Java, я удивлен, что для цикла multi-var for нет конструкции python. я подожду немного дольше, чтобы увидеть, есть ли лучший ответ, прежде чем принять ваш

@ user949110: Я добавил немного в свой ответ, показывающий, как вы можете указать оба в цикле for , хотя я думаю, что этот способ менее читабелен в этом случае.

@ d-кодер: я полагаю, что в этом случае вы могли бы использовать enumerate(xrange(n, 0, -1)) , но это еще менее читабельно и несколько запутанно, поскольку enumerate дает индексы, которые ОП говорит, что он не хочет , (Это только случайно дает правильные значения в этом случае.)

@BrenBarn Да! Он использует range(0,n) поэтому он дает правильные значения. Также я хотел бы отметить, что xrange был удален в Python 3.x и выше, верно?

Вы можете создать понимание списка с использованием более чем одной переменной управления контуром:

>>> n = 10 >>> stuff = [i*j for i in range(n) for j in range(n-1,-1,-1)] >>> stuff [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, 63, 56, 49, 42, 35, 28, 21, 14, 7, 0, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0, 81, 72, 63, 54, 45, 36, 27, 18, 9, 0] 

Многое зависит от итераторов, которые вы хотите. Вот пара вариантов. Что общего у них, так это то, что for. in. будет проходить через списки, кортежи и все, что поддерживает итерацию. Таким образом, вы можете перебрать список известных значений или генератор, который производит произвольную серию значений. Для for. in. то же самое.

Вот некоторые стандартные трюки python:

вложенные циклы

for i in range(10): for j in range (10): print i, j 

Это просто и понятно, но для сложных итераций он может быть очень глубоко вложен. Здесь range — это генератор, что означает, что он производит итерацию по ряду (в данном случае 10 чисел — но это может быть любой произвольный поток значений))

застежка-молния

для нескольких итераторов вы можете использовать zip() который создает итерируемый объект, который одновременно генерирует значение из каждого из нескольких итераций. Вы можете использовать множественное назначение внутри цикла for для захвата фрагментов из zip

a = [1,2,3,4] b = ['a','b','c','d'] for number, letter in zip (a, b): print letter, ":", number # a : 1 # b : 2 # c : 3 # d : 4 

zip остановится, когда первый член будет исчерпан:

a = [1,2] b = ['a','b','c','d'] for number, letter in zip (a, b): print letter, ":", number # a : 1 # b : 2 

zip также использует генераторы:

test = zip (range(10), range(10,20)) for item in test: print item #(0, 10) #(1, 11) #(2, 12) #(3, 13) #(4, 14) #(5, 15) #(6, 16) #(7, 17) #(8, 18) #(9, 19) 

itertools

Для более сложных итераций в модуле itertools есть много отличных инструментов. Это особенно хорошо для таких вещей, как получение всех продуктов или перестановок из нескольких итераторов. Это стоит проверить, но я думаю, что это больше, чем вам нужно

Ещё вопросы

  • 0 явный пример создания шаблона класса c ++ на macos, не работает на ubuntu
  • 0 Работа с несколькими состояниями и одним контроллером в angular.ui-router
  • 0 boost :: mutex поддерживает try_lock_for в Visual Studio, но не в Xcode
  • 1 Просмотр полноэкранного изображения после нажатия кнопки onClick
  • 0 Показать вставленное изображение с предыдущей страницы
  • 0 Requirejs — Динамическое внедрение зависимостей модуля с переменными
  • 0 preg_replace для сопоставления шаблона с любой стороны селектора
  • 1 URL открытое соединение для адреса ssl выдает исключение утверждения
  • 0 Проверка формы Zend2 с помощью плагина проверки формы jQuery
  • 0 Создание пакета установщика Windows
  • 1 Обнаружение арабских символов в регулярных выражениях
  • 0 Как анимировать размер этих вложенных элементов div? (JQuery)
  • 1 Поиск нескольких атрибутов в Монго с Метеором
  • 1 Сохранение стилей при замене слов в python-docx
  • 0 Выпадающее меню в ионном
  • 1 Обслуживание статической страницы из пользовательского действия scala в Play Framework
  • 1 Материал шейдера для управления памятью three.js
  • 1 Запустите фоновый код, когда зарядное устройство подключится
  • 1 Обновить значения словаря
  • 0 AngularJS: При каких конкретных обстоятельствах обещание, возвращаемое $ http, отклоняется?
  • 0 Сова Карусель не работает в angularjs частичный вид
  • 0 Создана форма регистрации и входа с php и mysql, и ошибка не работает в форме регистрации
  • 0 C ++, используя операторы if-else для вычисления sin и cos
  • 1 Интерфейс не вызывает фрагмент
  • 0 Входной параметр из командной строки как HEX с N-байтами
  • 0 Winsock send () проблема с однобайтовой передачей
  • 0 SQL-запрос не отправит в базу данных php
  • 0 WinDivert 1.0.5 DivertRecv () Метод Получить последнюю ошибку 998
  • 1 WCF замедляется с несколькими запросами
  • 1 Некоторые пользовательские маркеры не отображаются на Android-native-картах реакции
  • 0 Форма отправки onclick функции на ТД с php переменные отображаются
  • 0 MySQL — привязка сотрудников к счету №
  • 0 Сортировка списка, содержащего классы, на основе закрытых членов класса
  • 0 c # genereic sql context patameter
  • 1 Bluetooth получает данные от HC05 не работает. Я получаю эти данные мусора ����
  • 1 Невозможно получить какой-либо ответ от API (залп)
  • 1 Spring / Доступ к текущему applicationContext в фабричном методе одного компонента
  • 1 Хадсон не запускается
  • 1 Проблема создания метки времени (несколько) во время летнего времени
  • 0 Можем ли мы иметь автоматическую предустановку AspectRatio для выходных файлов из AWS Elastic Transcoder?
  • 0 Как найти повторяющееся значение значения столбца, используя mysql?
  • 0 Как связать файл статической библиотеки на машине Linux
  • 1 Как я могу разобрать номер только из элемента и положить число в переменную int?
  • 1 Как перечитать новости на сайте с помощью magazine3k
  • 1 Запустите одно приложение метро из другого приложения метро Windows 8
  • 1 Настройка EntityFramework 6 и WCF Data Services 5.6
  • 1 Как сохранить постоянные кнопки относительно изменения размера метки в PyQt4
  • 0 Плагин jQuery Validation — добавление класса ошибок к дополнительным элементам
  • 0 При использовании Angular с SignalR, как я могу уведомить контроллер, когда в объект вносится изменение?

Источник

Оцените статью