Как перебрать массив в python
Перейти к содержимому

Как перебрать массив в python

Python.v.JavaScript

JavaScript for Pythonistas. Python for JavaScripters

Цикл for

Цикл for используется для двух основных целей:

  1. Выполнить некоторое действие заданное число раз.
  2. Обработать все элементы некоторой структуры данных (например, списка).
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 .

Практическая работа

  1. Заполните список случайными числами. Используйте в коде цикл for, функции range() и randint() .
  2. Если объект range (диапазон) передать встроенной в Python функции list() , то она преобразует его к списку. Создайте таким образом список с элементами от 0 до 100 и шагом 17.
  3. В заданном списке, состоящем из положительных и отрицательных чисел, посчитайте количество отрицательных элементов. Выведите результат на экран.
  4. Напишите программу, которая заполняет список пятью словами, введенными с клавиатуры, измеряет длину каждого слова и добавляет полученное значение в другой список. Например, список слов – [‘yes’, ‘no’, ‘maybe’, ‘ok’, ‘what’], список длин – [3, 2, 5, 2, 4]. Оба списка должны выводиться на экран.

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Двумерные массивы в 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())

Эксперт функциональных языков программированияЭксперт Python

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))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *