Python.v.JavaScript
JavaScript for Pythonistas. Python for JavaScripters
Цикл for
Цикл for используется для двух основных целей:
- Выполнить некоторое действие заданное число раз.
- Обработать все элементы некоторой структуры данных (например, списка).
for i in range(4): print("i =", i)
i = 0 i = 1 i = 2 i = 3
for(var i=0; i
i = 0 i = 1 i = 2 i = 3
my_list = [1, 2, 10] for element in my_list: print(element)
1 2 10
var my_array = [1, 2, 10]; for (var i=0; i
1 2 10
Это наиболее безопасный способ перебора элементов массива. Поддерживается во всех версиях JS, нет опасности включить в перебор свойства, не являющиеся индексированными элементами списка, см. другой пример.
var my_array = [1, 2, 10]; for (i in my_array)
1 2 10
var my_array = [1, 2, 10]; for (element of my_array)
1 2 10
требует: es6
var my_array = [1, 2, 10]; my_array.forEach(function(v) < console.log(v) >)
1 2 10
for i in range(4): print("Step", i) print("Outside of loop, i =", i)
Step 0 Step 1 Step 2 Step 3 Outside of loop, i = 3
for (var i=0; i console.log("Outside of loop, i =", i)
Step 0 Step 1 Step 2 Step 3 Outside of loop, i = 4
for (let i=0; i console.log("Outside of loop, i =", i)
Step 0 Step 1 Step 2 Step 3 [stdin]:4 console.log("Outside of loop, i =", i) ^ ReferenceError: i is not defined at [stdin]:4:37 at Script.runInThisContext (vm.js:132:18) at Object.runInThisContext (vm.js:315:38) at Object. ([stdin]-wrapper:10:26) at Module._compile (internal/modules/cjs/loader.js:1256:30) at evalScript (internal/process/execution.js:98:25) at internal/main/eval_stdin.js:29:5 at Socket. (internal/process/execution.js:211:5) at Socket.emit (events.js:326:22) at endReadableNT (_stream_readable.js:1244:12)
my_list = [1, 2, 10] my_list.some_value = "I'm here!" for element in my_list: print(element)
Exception: AttributeError 'list' object has no attribute 'some_value'
В объект стандартного типа list невозможно добавить свойства.
class MyList(list): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) brand_new_list = MyList([1, 2, 10]) brand_new_list.some_value = "I'm here!" for element in brand_new_list: print(element)
1 2 10
Можно создать новый класс, наследуя от list (хотя в общем случае это не рекомендуется делать), и добавить к нему дополнительные свойства. Это не повлияет на перебор элементов списка с помощью for . in . .
var my_array = [1, 2, 10]; my_array.some_value = "I'm here!"; for (i in my_array)
1 2 10 I'm here!
В JavaScript массив — это просто (хорошо оптимизированный) объект с числовыми индексами. Если вы добавите ещё одно свойство в этот объект, оно окажется в числе перечисляемых с помощью for . in . .
var my_array = [1, 2, 10]; Array.prototype.some_value = "I'm here!"; for (i in my_array)
1 2 10 I'm here!
my_dict = for key in my_dict: print(key)
my_obj = Object.prototype.new_property = function() < return "Hello"; >for (key in my_obj)
a b new_property
В объектах JavaScript не различаются записи, свойства и методы. Более того: цикл for в данном случае перебирает не только по элементам самого объекта, но и по элементам его прототипа (если только они специально не отмечены как enumerable: false ).
my_obj = Object.prototype.new_property = function() < return "Hello"; >for (key in my_obj) < if (my_obj.hasOwnProperty(key)) < console.log(key); >>
my_dict = for key, value in my_dict.items(): print(key, "=>", value)
a => 10 b => 20
my_obj = Object.prototype.new_property = function() < return "Hello"; >for (key in my_obj) < if (my_obj.hasOwnProperty(key)) < console.log(key, "=>", my_obj[key]); > >
Цикл for
Цикл for в языке программирования Python предназначен для перебора элементов структур данных и других составных объектов. Это не цикл со счетчиком, каковым является for во многих других языках.
Что значит перебор элементов? Например, у нас есть список, состоящий из ряда элементов. Сначала берем из него первый элемент, затем второй, потом третий и так далее. С каждым элементом мы выполняем одни и те же действия в теле for . Нам не надо извлекать элементы по их индексам, заботиться, на каком из них список заканчивается, и следующая итерация бессмысленна. Цикл for сам переберет и определит конец.
>>> spisok = [10, 40, 20, 30] >>> for element in spisok: . print(element + 2) . 12 42 22 32
После ключевого слова for используется переменная под именем element . Имя здесь может быть любым. Нередко используют i . На каждой итерации цикла for ей будет присвоен очередной элемент из списка spisok . Так при первой прокрутке цикла идентификатор element связан с числом 10, на второй – с числом 40, и так далее. Когда элементы в spisok заканчиваются, цикл for завершает свою работу.
С английского «for» переводится как «для», «in» как «в». Перевести конструкцию с языка программирования на человеческий можно так: для каждого элемента в списке делать следующее (то, что в теле цикла).
В примере мы увеличивали каждый элемент на 2 и выводили его на экран. При этом сам список конечно же не изменялся:
>>> spisok [10, 40, 20, 30]
Нигде не шла речь о перезаписи его элементов, они просто извлекались и использовались. Однако бывает необходимо изменить сам список, например, изменить значение каждого элемента в нем или только определенных, удовлетворяющих определенному условию. И тут без переменной, обозначающей индекс элемента, случаев не обойтись:
>>> i = 0 >>> for element in spisok: . spisok[i] = element + 2 . i += 1 . >>> spisok [12, 42, 22, 32]
Но если мы вынуждены использовать счетчик, то выгода от использования цикла for не очевидна. Если знать длину списка, то почему бы не воспользоваться while . Длину можно измерить с помощью встроенной в Python функции len() .
>>> i = 0 >>> while i < len(spisok): . spisok[i] = spisok[i] + 2 # или spisok[i] += 2 . i = i + 1 # или i += 1 . >>> spisok [14, 44, 24, 34]
Кроме того, с циклом while мы избавились от переменной element .
Функция range()
Теперь пришло время познакомиться со встроенной в Python функцией range() . «Range» переводится как «диапазон». Она может принимать один, два или три аргумента. Их назначение такое же как у функции randrange() из модуля random . Если задан только один, то генерируются числа от 0 до указанного числа, не включая его. Если заданы два, то числа генерируются от первого до второго, не включая его. Если заданы три, то третье число – это шаг.
Однако, в отличие от randrange() , функция range() генерирует не одно случайное число в указанном диапазоне. Она вообще не генерирует случайные числа. Она генерирует последовательность чисел в указанном диапазоне. Так, range(5, 11) сгенерирует последовательность 5, 6, 7, 8, 9, 10. Однако это будет не структура данных типа «список». Функция range() производит объекты своего класса – диапазоны:
>>> a = range(-10, 10) >>> a range(-10, 10) >>> type(a)
Несмотря на то, что мы не видим последовательности чисел, она есть, и мы можем обращаться к ее элементам:
>>> a[0] -10 >>> a[5] -5 >>> a[15] 5 >>> a[-1] 9
Хотя изменять их нельзя, так как, в отличие от списков, объекты range() относятся к группе неизменяемых:
>>> a[10] = 100 Traceback (most recent call last): File "", line 1, in TypeError: 'range' object does not support item assignment
Цикл for и range()
Итак, зачем нам понадобилась функций range() в теме про цикл for ? Дело в том, что вместе они образуют неплохой тандем. For как цикл перебора элементов, в отличие от while , позволяет не следить за тем, достигнут ли конец структуры. Не надо вводить счетчик для этого, изменять его и проверять условие в заголовке. С другой стороны, range() дает последовательность целых чисел, которые можно использовать как индексы для элементов того же списка.
>>> range(len(spisok)) range(0, 4)
Здесь с помощью функции len() измеряется длина списка. В данном случае она равна четырем. После этого число 4 передается в функцию range() , и она генерирует последовательность чисел от 0 до 3 включительно. Это как раз индексы элементов нашего списка.
Теперь «соединим» for и range() :
>>> spisok = [14, 44, 24, 34] >>> for i in range(len(spisok)): . spisok[i] += 2 . >>> spisok [16, 46, 26, 36]
Еще раз обратим внимание, в заголовке цикла for берутся элементы вовсе не списка, а объекта range .
Практическая работа
- Заполните список случайными числами. Используйте в коде цикл for, функции range() и randint() .
- Если объект range (диапазон) передать встроенной в Python функции list() , то она преобразует его к списку. Создайте таким образом список с элементами от 0 до 100 и шагом 17.
- В заданном списке, состоящем из положительных и отрицательных чисел, посчитайте количество отрицательных элементов. Выведите результат на экран.
- Напишите программу, которая заполняет список пятью словами, введенными с клавиатуры, измеряет длину каждого слова и добавляет полученное значение в другой список. Например, список слов – [‘yes’, ‘no’, ‘maybe’, ‘ok’, ‘what’], список длин – [3, 2, 5, 2, 4]. Оба списка должны выводиться на экран.
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование
Двумерные массивы в Python и методы работы с ними
Иногда нам приходится использовать таблицы с данными для решения своих задач. Такие таблицы называются матрицами или двумерными массивами.
В Python подобные таблицы можно представить в виде списка, элементы которого являются другими списками. Для примера создадим таблицу с тремя столбцами и тремя строками, заполненными произвольными буквами:
mas = [['й', 'ц', 'у'], ['к','е','н'], ['г', 'ш', 'щ']] #Вывод всего двумерного массива print(mas) #Вывод первого элемента в первой строке print(mas[0][0]) # Выведет й #Вывод третьего элемента в третьей строке print(mas[2][2]) # Выведет щ
Создание двумерных массивов
Создать такой массив в Python можно разными способами. Разберем первый:
# Создание таблицы с размером 3x3, заполненной нулями a = 3 mas = [0] * a for i in range(a): mas[i] = [0] * a print(mas) # Выведет [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Второй способ предполагает создание пустого списка с добавлением в него новых списков. Рассмотрим на примере:
# Создание таблицы с размером 2x2, заполненной единицами
a = 2 mas = [] for i in range(a): mas.append([0] * a) print(mas) # Выведет [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
Третьим и самым простым способом является генератор списков с x строками, которые будут состоять из y элементов. Пример:
# Создание таблицы с размером 3x3, заполненной двойками a = 3 mas = [[2] * a for i in range(a)] print(mas) # Выведет [[2, 2, 2], [2, 2, 2], [2, 2, 2]]
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Способы ввода двумерных массивов
Допустим, нам нужно ввести двумерный массив после запуска нашей программы. Для этого мы можем создать программу, которая будет построчно считывать значения нашего массива, а также количество строк в нем. Рассмотрим на примере:
a=int(input()) mas = [] for i in range(a): mas.append(list(map(int, input().split()))) print(mas)
Запускаем программу и сначала вводим количество строк в массиве (допустим, 3). Далее вводим строки в порядке их очереди. Например:
1 1 1 1 1 1 1 1 1
После этого данная программа выведет наш двумерный массив: [[1, 1, 1], [1, 1, 1], [1, 1, 1]].
То же самое можно сделать с помощью генератора двумерных массивов:
mas = [list(map(int, input().split())) for i in range(int(input()))] # Вводим 3 1 1 1 1 1 1 1 1 1 print(mas) # Выведет [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
Вывод двумерных массивов
Для обработки и вывода списков используются два вложенных цикла. Первый цикл – по порядковому номеру строки, второй – по ее элементам. Например, вывести массив можно так:
mas = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] for i in range(0, len(mas)): for i2 in range(0, len(mas[i])): print(mas[i][i2], end=' ') print() # Выведет 1 1 1 1 1 1 1 1 1
То же самое можно сделать не по индексам, а по значениям массива:
mas = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] for i in mas: for i2 in i: print(i2, end=' ') print() # Выведет 1 1 1 1 1 1 1 1 1
Способ с использованием метода join():
mas = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] for i in mas: print(' '.join(list(map(str, i)))) # Выведет 1 1 1 1 1 1 1 1 1
Вывод одной из строк двумерного массива можно осуществить с помощью цикла и того же метода join(). Для примера выведем вторую строку в произвольном двумерном массиве:
mas = [[1, 1, 1], [2, 2, 2], [3, 3, 3]] string = 2 for i in mas[string-1]: print(i, end=' ') # Выведет 1 1 1
Для вывода определенного столбца в двумерном массиве можно использовать такую программу:
mas = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] column = 2 for i in mas: print(i[column-1], end=' ') # Выведет 2 5 8
Обработка двумерных массивов
Составим произвольный двумерный массив с числами и размерностью 4×4:
2 4 7 3 4 5 6 9 1 0 4 2 7 8 4 7
Теперь поставим числа в каждой строке по порядку:
mas = [[2, 4, 7, 3], [4, 5, 6, 9], [1, 0, 4, 2], [7, 8, 4, 7]] mas2 = [] for i in mas: mas2.append(sorted(i)) print(mas2) # Выведет [[2, 3, 4, 7], [4, 5, 6, 9], [0, 1, 2, 4], [4, 7, 7, 8]]
А теперь расставим все числа по порядку, вне зависимости от их нахождения в определенной строке:
mas = [[2, 4, 7, 3], [4, 5, 6, 9], [1, 0, 4, 2], [7, 8, 4, 7]] mas2 = [] for i in mas: for i2 in i: mas2.append(i2) mas=sorted(mas2) for x in range(0, len(mas), 4): e_c = mas[x : 4 + x] if len(e_c) < 4: e_c = e_c + [None for y in range(n - len(e_c))] print(list(e_c)) # Выведет [0, 1, 2, 2] [3, 4, 4, 4] [4, 5, 6, 7] [7, 7, 8, 9]
Итог
Мы разобрались в основах двумерных массивов в Python, научились создавать, вводить и выводить их, а также рассмотрели примеры обработки. Надеюсь, статья оказалась полезной для вас!
Перебор всех комбинаций массива
Суть задачи:
Имеется массив с неким количеством людей. Нужно сопоставить каждому человеку другого, пока не будут использованы все комбинации, а после этого вывести ТОП людей(с наибольшим числом выбора)
Пример:
Выбери: Name1 or Name2
Выбери: Name1 or Name3
.
Выбери: Name2 or Name3
и тд.
1 2 3 4 5 6 7 8 9
import random as rnd all_friends = ["Name1", "Name2", "Name3", "Name4", "Name5", "Name6"] rnd.shuffle(all_friends) def choosing(array: list): k = 0 print('Привет! Выбери одного из двух людей: ')
Добавлено через 34 секунды
по идее для каждого человека нужно иметь свой счетчик.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Перебор всех комбинаций
Всем привет. Уже два дня бьюсь над одной задачей. В общем, суть в том, что нужно составлять список.
Перебор комбинаций
Подскажите, как перебрать все возможные комбинации чисел длинной 3, если мы можем использовать для.
Перебор комбинаций из 2-х и более элементов
import math integer_ariangles = for a in range(1,100): for b in range(1,100): for.
Быстрый перебор всех диагоналей двумерного массива (матрица)
Доброго времени суток, уважаемые форумчане, ОЧЕНЬ нужна ваша помощь, мне ОЧЕНЬ СРОЧНО необходимо.
287 / 168 / 90
Регистрация: 21.03.2016
Сообщений: 398
Используй ООП.
В атрибутах имя и список друзей.
Добавлено через 9 минут
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
class Man: def __init__(self): self.frinds_list = [] def get_frinds(self, frind): if frind not in self.frinds_list: self.frinds_list.append(frind) else: print('Этот человек есть в списке друзей.') def number_of_friends(self): return len(self.frinds_list) name1 = Man() name2 = Man() name3 = Man() name1.get_frinds(name2) name1.get_frinds(name3) print(name1.number_of_friends(), name2.number_of_friends())
1183 / 759 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
1 2 3 4 5 6 7 8 9 10 11
from itertools import combinations res = {} all_friends = ["Name1", "Name2", "Name3", "Name4", "Name5", "Name6"] for i, j in combinations(all_friends, 2): tmp = input(f'Привет! Выбери одного из двух людей или : ') while tmp not in (i, j): tmp = input(f'Мде, еще разок, Выбери одного из двух людей или : ') res[tmp] = res.get(tmp, 0) + 1 print(*res.items())
35367 / 19966 / 4181
Регистрация: 12.02.2012
Сообщений: 33,130
Записей в блоге: 13
1 2 3 4 5 6
all_friends = ["Name1", "Name2", "Name3", "Name4", "Name5", "Name6"] for a1 in all_friends: for a2 in all_friends: if (a1 != a2): print((a1,a2))
Регистрация: 20.10.2019
Сообщений: 118
А как это на телеграм бота перенести, используя библиотеку telebot?
Добавлено через 22 секунды
Именно код, который enx предложил
2519 / 1964 / 492
Регистрация: 17.02.2014
Сообщений: 9,282
Сообщение от Berbentsev
Используй ООП.
вот так, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
import random class Man: def __init__(self, name_par: str, friends_par: list, popularity_par=0): self.name = name_par if self.name in friends_par: friends_par.remove(self.name) self.friends = friends_par self.popularity = popularity_par def __repr__(self): return '\'' + self.name + '\' -> ' + str(self.popularity) + ' >* < '+ str(self.friends) def people_generator(names: list): ret_pl = [] for nm in names: get_index_end = random.randint(1, len(names) - 1) ret_pl.append(Man(nm, list(names[get_index_end:]))) return ret_pl def get_most_popular_person(ppl_list: list): for pop_index in range(0, len(ppl_list) - 2): tmp_pers = ppl_list[pop_index] for src_index in range(pop_index + 1, len(ppl_list) - 1): if tmp_pers.name in ppl_list[src_index].friends: tmp_pers.popularity += 1 if ppl_list[src_index].name in tmp_pers.friends: ppl_list[src_index].popularity += 1 ppl_list.sort(key=lambda x: x.popularity, reverse=True) return ppl_list[0] names = ["Name1", "Name2", "Name3", "Name4", "Name5", "Name6"] ppl = people_generator(names) for p in ppl: print(p) mpop = get_most_popular_person(ppl) print('<> -> his popularity is <>'.format(mpop, mpop.popularity))