Python set() наборы и множества

Содержание:

Вопросы пользователей по теме Python

AttributeError: модуль ‘xml.etree.ElementTree’ не имеет атрибута ‘ElimentTree’

Я пытаюсь удалить элемент из XML-документа, но получаю сообщение об ошибке:
Traceback (most recent call last):
File «C:/Ashok/del_element_tree_country_2.py», line 25, in <module>
tree = ET.ElimentTree(root)
AttributeError: module ‘xml.etree.ElementTree’ has no attribute ‘ElimentTree’

Мой код:….

27 Ноя 2021 в 17:17

Python: как вернуть наиболее часто встречающееся значение в каждой строке в зависимости от столбцов исправления?

У меня есть датафрейм, как показано ниже:
import pandas as pd

# intialise data of lists.
data = {‘Name’:,
‘Book1’:,
‘Book2’:,
‘Book3’:,
‘Book4’:}

# Create DataFrame
df = pd….

27 Ноя 2021 в 16:48

Печать чисел с плавающей запятой в Python для системы координат

Я пытаюсь написать метод, который генерирует и возвращает n случайных точек в 2-мерном пространстве с учетом ширины и высоты в Python. Я закодировал алгоритм, но я хочу получать в системе точки с плавающей запятой. Вот мой код:
import random

npoints = int(input(«Type the npoints:»))
width = in….

27 Ноя 2021 в 16:23

Как получить любую комбинацию атрибутов объекта и вернуть соответствующие объекты из списка объектов в Python?

Прошу прощения, если на этот вопрос был дан ответ раньше, но я вообще не смог найти ответа на эту проблему.
Допустим, у меня есть этот класс и список объектов:
def Person:
def __init__(self, name, country, age):
self.name = name
self.country = country
self.age = age
perso….

27 Ноя 2021 в 16:20

Преобразование списка из двух чисел в индексы для массива

Краткая версия: учитывая список с двумя элементами , как мне получить i , j -элемент двухмерного массива вместо i , j строк: от arr] до arr.
Я видел похожие случаи, когда использовался *list, но я не совсем понимаю, как работает этот оператор.
Более глубокий контекст:
У меня ….

27 Ноя 2021 в 16:07

Доступ к атрибуту класса, когда имя является зарезервированным ключевым словом — Python

У меня есть объект «элемент» (), полученный в результате вызова API (JSON) следующим образом:
{
«id»: 1,
«type»: 10,
«via»: {
«from»:{
«id»: «511»,
«name»: «a»
},
«to»:{
«id»: «999»,
«name»: «b»
}
}
}

Итак, когда я это сделаю
print(item.via.to[….

27 Ноя 2021 в 15:56

Доступ к данным модели ForeingKey в Django

Мне нужен доступ к данным модели ForeignKey, но я не знаю, как это сделать. Я написал это как простой пример того, что хочу сделать:
class Model1(models.Model):
name = models.CharField(max_length=100)
phone_number = models.BigIntegerField()

class Model2(models.Model):
model1 = models.ForeignKey(Mo….

27 Ноя 2021 в 15:36

Калькулятор не подводит итоги

Я пытаюсь указать сумму в поле ввода всякий раз, когда пользователь суммирует или вычитает ввод. однако он не показывает общую сумму, а объединяет их в одну строку. так, например, я хочу сложить 15 и 1. Сначала пользователь вводит 15, затем нажимает +, затем 1. вместо 16 он получает 151.
import tk….

27 Ноя 2021 в 15:28

Найдите только определенные элементы в таблице с красивым супом

Я пытаюсь получить атрибуты href из таблицы в этой сети. У меня есть этот код, чтобы получить все ссылки, но я хочу отфильтровать, чтобы получить доступ только к href для «Automaticas», а не «Manuales».
# Fetch URL
url = ‘http://meteo.navarra.es/estaciones/descargardatos.cfm’

request = urllib2.Req….

27 Ноя 2021 в 15:27

Найти строку между двумя символами внутри dict

Вы можете найти подстроку между символами Я хочу найти этот символ svm? Я посмотрел на Получить строку между двумя строками и Найти строку между двумя подстроками. Итак, это моя строка (‘svm’, SVC()), и я хочу найти все между ‘ ‘, поэтому результат должен быть svm или dct_test
import re
dict_Supp….

27 Ноя 2021 в 12:00

3. Как преобразовать список в другие структуры данных в Python?

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

Как преобразовать список в строку

Преобразовать список в строку можно при помощи функции . Данная операция склеит все элементы нашего списка вместе и вернет строку. Более подробно об этом можно прочитать в .

# Преобразование списка строк в строку
listOfStrings = 
strOfStrings = ''.join(listOfStrings)
print(strOfStrings)

# Преобразование списка чисел в строку
listOfNumbers = 
strOfNumbers = ''.join(str(n) for n in listOfNumbers)
print(strOfNumbers)

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

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

Как преобразовать список в кортеж

Преобразовать список в кортеж можно при помощи функции . Передайте в нее в качестве аргумента ваш список, и на выходе вы получите кортеж.

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

Как преобразовать список в множество

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

Преобразовать список в множество можно при помощи функции . Просто передайте в нее ваш список, и на выходе получите множество.

Как преобразовать список в словарь

Словари в Python имеют дело с ключами и значениями, поэтому преобразование списка в словарь выглядит не таким явным. Допустим, у нас есть следующий список:

Нам нужно, чтобы пары элементов и , а также и интерпретировались как пары ключ-значение. Чтобы это сделать, разобьем наш список на два одинаковых списка при помощи срезов и передадим эти два списка в функцию .

В результате получим:

Заметьте, что для вывода результата на экран мы обернули функцию в функцию .

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

# Преобразуем в словарь
helloWorldDictionary = dict(zip(helloWorld, helloWorld))

# Выводим результат на экран
print(helloWorldDictionary)

В результате получится следующий словарь:

Если у вас список большой, то вероятно лучше будет сделать следующим образом:

a = 

# Создаем итератор списка
i = iter(a)

# Создаем и выводим на экран словарь
print(dict(zip(i, i)))

Результат:

Заметим, что из итерируемого объекта всегда можно получить итератор. Объект итератор, в котором реализован метод , содержит в себе информацию о том, на каком шаге сейчас проходит итерация и каким будет следующий элемент последовательности.

Python Set Operations

Sets can be used to carry out mathematical set operations like union, intersection, difference and symmetric difference. We can do this with operators or methods.

Let us consider the following two sets for the following operations.

Set Union

Set Union in Python

Union of A and B is a set of all elements from both sets.

Union is performed using operator. Same can be accomplished using the method.

Output

{1, 2, 3, 4, 5, 6, 7, 8}

Try the following examples on Python shell.

Set Intersection

Set Intersection in Python

Intersection of A and B is a set of elements that are common in both the sets.

Intersection is performed using operator. Same can be accomplished using the method.

Output

{4, 5}

Try the following examples on Python shell.

Set Difference

Set Difference in Python

Difference of the set B from set A(AB) is a set of elements that are only in A but not in B. Similarly, BA is a set of elements in B but not in A.

Difference is performed using operator. Same can be accomplished using the method.

Output

{1, 2, 3}

Try the following examples on Python shell.

Set Symmetric Difference

Set Symmetric Difference in Python

Symmetric Difference of A and B is a set of elements in A and B but not in both (excluding the intersection).

Symmetric difference is performed using operator. Same can be accomplished using the method .

Output

{1, 2, 3, 6, 7, 8}

Try the following examples on Python shell.

Удаление элементов из множества

Python предоставляет методы discard() и remove(), которые можно использовать для удаления элементов из множества. Разница между этими функциями: при использовании функции discard(), если элемент не существует в множестве, набор остается неизменным, тогда как метод remove() выдаст ошибку.

Рассмотрим следующий пример.

Пример 1. Использование метода discard()

months = set()    
print("\nprinting the original set ... ")    
print(months)    
print("\nRemoving some months from the set...");    
months.discard("January");    
months.discard("May");    
print("\nPrinting the modified set...");    
print(months)    
print("\nlooping through the set elements ... ")    
for i in months:    
    print(i)      

Выход:

printing the original set ... 
{'February', 'January', 'March', 'April', 'June', 'May'}

Removing some months from the set...

Printing the modified set...
{'February', 'March', 'April', 'June'}

looping through the set elements ... 
February
March
April
June

Python также предоставляет метод remove() для удаления элемента из множества. Рассмотрим следующий пример, чтобы удалить элементы с помощью метода remove().

Пример 2. Использование функции remove()

months = set()    
print("\nprinting the original set ... ")    
print(months)    
print("\nRemoving some months from the set...");    
months.remove("January");    
months.remove("May");    
print("\nPrinting the modified set...");    
print(months)   

Выход:

printing the original set ... 
{'February', 'June', 'April', 'May', 'January', 'March'}

Removing some months from the set...

Printing the modified set...
{'February', 'June', 'April', 'March'}

Мы также можем использовать метод pop() для удаления элемента. Как правило, метод pop() всегда удаляет последний элемент, но set неупорядочено, мы не можем определить, какой элемент будет извлечен из множества.

Рассмотрим следующий пример, чтобы удалить элемент из множества с помощью метода pop().

Months = set()    
print("\nprinting the original set ... ")    
print(Months)    
print("\nRemoving some months from the set...");    
Months.pop();    
Months.pop();    
print("\nPrinting the modified set...");    
print(Months)      

Выход:

printing the original set ... 
{'June', 'January', 'May', 'April', 'February', 'March'}

Removing some months from the set...

Printing the modified set...
{'May', 'April', 'February', 'March'}

В приведенном выше коде последним элементом набора месяцев является март, но метод pop() удалил июнь и январь, поскольку набор неупорядочен, а метод pop() не смог определить последний элемент множества.

Python предоставляет метод clear() для удаления всех элементов из множества.

Рассмотрим следующий пример:

Months = set()    
print("\nprinting the original set ... ")    
print(Months)    
print("\nRemoving all the items from the set...");    
Months.clear()    
print("\nPrinting the modified set...")    
print(Months)      

Выход:

printing the original set ... 
{'January', 'May', 'June', 'April', 'March', 'February'}

Removing all the items from the set...

Printing the modified set...
set()

Другие операции над множествами

Проверка принадлежности к множеству

Мы можем проверить, существует ли элемент во множестве, используя ключевое слово in.

# инициализируем my_set
my_set = set("apple")

# проверяем, присутствует ли 'a'
# Вывод: True
print('a' in my_set)

# проверяем, присутствует ли 'p' 
# Вывод: False
print('p' not in my_set)

Итерация множества

Используя цикл for, можно выполнить переборку каждого элемента во множестве.

>>> for letter in set("apple"):
...     print(letter)
...    
a
p
e
l

Встроенные функции с множествами

Встроенные функции, такие как all(), any(), enumerate(), len(), max(), min(), sorted(), sum() , используются с множеством для выполнения различных задач.

Встроенные функции для работы с множествами
Функция Описание
all() Возвращает значение True, если все элементы множества являются true (или если множество пусто).
any() Возвращает значение True, если какой-либо элемент множества является true. Если множество пусто, возвращает значение False.
enumerate() Возвращает пронумерованный объект. Содержит индекс и значение всех элементов множества в виде пары.
len() Возвращает длину (количество элементов) множества.
max() Возвращает наибольший элемент во множестве.
min() Возвращает наименьший элемент во множестве.
sorted() Возвращает новый отсортированный список, состоящий из элементов множества (не сортирует само множество).
sum() Возвращает сумму всех элементов множества.

Python Frozenset

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

Frozenset может быть создан с помощью функции frozenset(). Этот тип данных поддерживает такие методы, как copy(), difference(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference() и union(). Но он не поддерживает методы добавления или удаления элементов.

# инициализируем A и B
A = frozenset()
B = frozenset() 

Протестируйте эти примеры.

>>> A.isdisjoint(B)
False
>>> A.difference(B)
frozenset({1, 2})
>>> A | B
frozenset({1, 2, 3, 4, 5, 6})
>>> A.add(3)
...
AttributeError: 'frozenset' object has no attribute 'add'

Пожалуйста, опубликуйте ваши комментарии по текущей теме материала. Мы очень благодарим вас за ваши комментарии, лайки, подписки, дизлайки, отклики!

Вадим Дворниковавтор-переводчик статьи «Python Sets»

Списки в Python

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

Мы можем создавать списки, используя квадратные скобки. Давайте рассмотрим следующий пример, чтобы понять список.

Пример:

 
# Creating a list of eight elements 
mylist =  
 
print(mylist) 

Выход:

Объяснение:

В приведенном выше примере мы создали список из восьми элементов, используя квадратные скобки, заключающие элементы. Затем мы напечатали список для пользователей.

Можно заметить, что один элемент повторяется в списке. Это означает, что элементы списка упорядочены, изменяемы и допускают повторяющиеся значения. Индексирование элементов списка начинается с для первого элемента, – для второго элемента и так далее.

2. Как лучше выбирать элементы из списка?

Если вы хотите продуктивно работать со списками, то должны уметь получать доступ к данным, хранящимся в них.

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

# Выбираем первый элемент списка
oneZooAnimal = biggerZoo

# Выводим на экран переменную `oneZooAnimal`
print(oneZooAnimal)

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

Как получить последний элемент списка?

Ответ на этот вопрос является дополнением к объяснению в предыдущем разделе.

Попробуйте ввести отрицательное значение, например, или , в оператор индекса, чтобы получить последние элементы нашего списка !

# Вставляем -1 
monkeys = biggerZoo
print(monkeys)

# А теперь -2
zebra = biggerZoo
print(zebra)

Не правда ли, не слишком сложно?

Что означает ошибка «Index Out Of Range»?

Эта ошибка одна из тех, которые вы будете видеть достаточно часто, особенно если вы новичок в программировании.

Лучший способ понять эту ошибку — попробовать ее получить самостоятельно.

Возьмите ваш список и передайте в оператор индекса либо очень маленькое отрицательное число, либо очень большое положительное число.

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

Срезы в списках

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

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

# Используем нотацию срезов
someZooAnimals = biggerZoo

# Выводим на экран то, что мы выбрали
print(someZooAnimals)

# Теперь поменяем местами 2 и двоеточие
otherZooAnimals = biggerZoo

# Выводим на экран полученный результат
print(otherZooAnimals)

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

Что же происходит во втором случае, когда мы поменяли местами индекс и двоеточие? Вы можете видеть, что мы получаем список из двух элементов, и . В данном случае мы стартуем с индекса и доходим до индекса (не включая его). Как вы можете видеть, результат не будет включать элемент .

В общем, подводя итоги:

# элементы берутся от start до end (но элемент под номером end не входит в диапазон!)
a

# элементы берутся начиная со start и до конца
a    

# элементы берутся с начала до end (но элемент под номером end не входит в диапазон!)
a

Совет: передавая в оператор индекса только двоеточие, мы создаем копию списка.

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

# Начиная со start, не доходя до end, с шагом step
a

Так что же по сути дает значение шага?

Ну, это позволяет вам буквально шагать по списку и выбирать только те элементы, которые включает в себя значение вашего шага. Вот пример:

Обратите внимание, что если вы не указали какое-либо значение шага, оно будет просто установлено в значение. При проходе по списку ни один элемент пропущен не будет

Также всегда помните, что ваш результат не включает индекс конечного значения, который вы указали в записи среза!

Как случайным образом выбрать элемент из списка?

Для этого мы используем пакет .

# Импортируем функцию `choice` из библиотеки `random` 
from random import choice

# Создадим список из первых четырех букв алфавита
list = 

# Выведем на экран случайный элемент списка
print(choice(list))

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

# Импортируем функцию `randrange` из библиотеки `random`
from random import randrange

# Создадим список из первых четырех букв алфавита
randomLetters = 

# Выбираем случайный индекс нашего списка
randomIndex = randrange(0,len(randomLetters))

# Выводим случайный элемент на экран
print(randomLetters)

Совет: обратите внимание на библиотеку , она может вам пригодиться во многих случаях при программировании на Python

6. Как разбить список Python на равные части?

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

# Наш список `x`
x = 

# Разбиваем `x` на 3 части
y = zip(**3)

# Выводим результат
list(y)

Результат:

Данный код работает следующим образом:

  • Функция создает итератор последовательности.
  • Выражение  создает три объекта типа  , каждый из них — итератор списка .
  • Символ ««, стоящий перед аргументом в функции , распаковывает стоящее после него выражение таким образом, как будто мы передаем один и тот же итератор в функцию три раза, и из каждого итератора функция извлекает элемент.

Стоп! Последний шаг абсолютно непонятен!

Давайте еще раз пройдемся по шагам:

У нас есть три объекта итератора списка x

Представим их следующим образом:
В первый раз функция берет по одному элементу последовательно из итераторов списка, что дает нам следующую картину:Обратите внимание, что объекты итератора внимательно отслеживают, какой элемент идет следующим!
Во второй раз следующие элементы будут добавлены в три наши списка, что соответственно даст нам:
И в последний раз, после выполнения данной процедуры мы получим:
Соединение этих списков вместе даст нам следующий список из трех кортежей:. Если вы хотите применить эту логику в самостоятельно написанной функции, то можете получить вот такой результат:

Если вы хотите применить эту логику в самостоятельно написанной функции, то можете получить вот такой результат:

# Данная функция разбивает список на равные части
def chunks(list, chunkSize):
    """Yield successive chunkSize-sized chunks from list."""
    for i in range(0, len(list), chunkSize):
        yield list

# Выводим результаты на экран
import pprint
pprint.pprint(list(chunks(range(10, 75), 10)))

Результат:

Функция принимает в качестве аргументов список и число частей, на которые его надо разделить.

Внутри нее вы видите цикл, диапазон которого задается функцией . Он начинается от 0 и заканчивается целым числом, обозначающим длину списка. Величина шага задается числом , которое является аргументом функции .

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

Заметим, что для более красивой печати мы используем функцию , что расшифровывается как pretty print.

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

# Определим наш список и размер блока
list = range(0, 50)
chunk = 5

# Разбиваем список на блоки
 for i in range(0, len(list), chunk)]

Результат:

Other Set Operations

We can test if an item exists in a set or not, using the keyword.

Output

True
False

Built-in Functions with Set

Built-in functions like , , , , , , , etc. are commonly used with sets to perform different tasks.

Function Description
all() Returns if all elements of the set are true (or if the set is empty).
any() Returns if any element of the set is true. If the set is empty, returns .
enumerate() Returns an enumerate object. It contains the index and value for all the items of the set as a pair.
len() Returns the length (the number of items) in the set.
max() Returns the largest item in the set.
min() Returns the smallest item in the set.
sorted() Returns a new sorted list from elements in the set(does not sort the set itself).
sum() Returns the sum of all elements in the set.

Операции над множествами в Python

Если вы помните основы математики в старшей школе, вы, вероятно, вспомните такие математические операции над множеством, как объединение, пересечение, разность и симметричная разность. Что ж, те же самые операции применимы и ко множествам в Python.

1. Объединение множеств

Результат объединения двух множеств – это множество всех элементов из обоих множеств без дубликатов. Для объединения множеств в Python используется метод или оператор .

first_set = {1, 2, 3}
second_set = {3, 4, 5}
first_set.union(second_set)
# {1, 2, 3, 4, 5}

first_set | second_set     # использование оператора `|`
# {1, 2, 3, 4, 5}

2. Пересечение множеств

Результат пересечения двух множеств – это множество всех общих элементов из обоих множеств. Для получения пересечения можно использовать метод или оператор .

first_set = {1, 2, 3, 4, 5, 6}
second_set = {4, 5, 6, 7, 8, 9}
first_set.intersection(second_set)
# {4, 5, 6}

first_set & second_set     # использование оператора `&` 
# {4, 5, 6}

3. Разность множеств

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

first_set = {1, 2, 3, 4, 5, 6}
second_set = {4, 5, 6, 7, 8, 9}
first_set.difference(second_set)
# {1, 2, 3}

first_set - second_set     # использование оператора `-` 
# {1, 2, 3}

second_set - first_set
# {8, 9, 7}

4. Симметричная разность

Симметричная разность двух множеств – это множество из всех элементов, имеющихся только в первом множестве и только во втором, но не в обоих сразу.

Для этой операции вы можете использовать метод или оператор .

first_set = {1, 2, 3, 4, 5, 6}
second_set = {4, 5, 6, 7, 8, 9}
first_set.symmetric_difference(second_set)
# {1, 2, 3, 7, 8, 9}

first_set ^ second_set     # использование оператора `^`
# {1, 2, 3, 7, 8, 9}

Как изменить множество с помощью операций

Каждая из операций над множествами, которые мы обсуждали выше, может использоваться для изменения существующего множества в Python.

Для обновления значения переменной можно использовать расширенный синтаксис присваивания, такой как или . Со множествами это тоже работает:

a = {1, 2, 3, 4, 5, 6}
b = {4, 5, 6, 7, 8, 9}

a.update(b)          # объединение
a
# {1, 2, 3, 4, 5, 6, 7, 8, 9}

a &= b               # пересечение
a
# {4, 5, 6, 7, 8, 9}

a -= set((7, 8, 9))  # разность
a
# {4, 5, 6}

a ^= b               # симметричная разность
a
# {7, 8, 9}

Другие операции над множествами в Python

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

  • или оператор возвращает , если является подмножеством
  • или оператор возвращает , если является надмножеством
  • возвращает , если в множествах и нет общих элементов
Добавить комментарий

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

Adblock
detector