Как вывести set c
Перейти к содержимому

Как вывести set c

Особенности языков программирования

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

Проще всего начать знакомство с STL со стандартных типов для хранения данных — контейнеров. Каждый раз, когда в программе возникает необходимость оперировать множеством элементов, в дело вступают контейнеры. Контейнер — это практическая реализация функциональности некоторой структуры данных. В языке C (не в C++) существовал только один встроенный тип контейнера: массив. Сам по себе массив имеет ряд недостатков: к примеру, размер динамически выделенного массива невозможно определить на этапе выполнения. Однако основной причиной для более внимательного ознакомления с контейнерами STL является отнюдь не вышеперечисленные недостатки массива. Истинная причина кроется несколько глубже. Дело в том, что в реальном мире структура данных, информацию о которых необходимо хранить, далеко не всегда удачно представима в виде массива. В большинстве случаев требуется контейнер несколько иной функциональности. К примеру, нам может потребоваться структура данных «множество строк», поддерживающая следующие функции:
— добавить строку к множеству;
— удалить строку из множества;
— определить, присутствует ли в рассматриваемом множестве данная строка;
— узнать количество различных строк в рассматриваемом множестве;
— просмотреть всю структуру данных, «пробежав» все присутствующие строки. Конечно, легко запрограммировать тривиальную реализацию функциональность подобной структуры данных на базе обычного массива. Но такая реализация будет крайне неэффективной. Для достижения приемлемой производительности имеет смысл реализовать хэш-таблицу или сбалансированное дерево, но задумайтесь: разве реализация подобной структуры данных (хэш либо дерево) зависит от типа хранимых объектов? Если мы потом захотим использовать ту же структуру не для строк, а, скажем, для точек на плоскости — какую часть кода придётся переписывать заново? Реализация подобных структур данных на чистом C оставляла программисту два пути. 1) Жёсткое решение (Hard-Coded тип данных). При этом изменение типа данных приводило к необходимости внести большое число изменений в самых различных частях кода. 2) По возможности сделать обработчики структуры данных независимыми от используемого типа данных. Иными словами, использовать тип void* везде, где это возможно. По какому бы пути реализации структуры данных в виде контейнера вы не пошли, скорее всего, никто другой ваш код понять, и тем более модифицировать, будет не в состоянии. В лучшем случае другие люди смогут им просто пользоваться. Именно для таких ситуаций существуют стандарты — чтобы программисты могли говорить друг с другом на одном и том же формальном языке. Шаблоны (Templates) в C++ предоставляют замечательную возможность реализовать контейнер один раз, формализовать его внешние интерфейсы, дать асимптотические оценки времени выполнения каждой из операций, а после этого просто пользоваться подобным контейнером с любым типом данных. Можете быть уверены: разработчики стандарта C++ так и поступили. В первой части курса мы на практике познакомимся с основными концепциями, положенными в основу контейнеров C++.

Контейнер set (множество)

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

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

Подробней о возможностях контейнера set можно прочитать, например, на сайте cppreference.com.

В простейшем случае множество, например, данных типа int объявляется так:

Для добавления элемента в множество используется метод insert :

Для проверки принадлежности элемента множеству используется метод count . Этот метод возвращает количество вхождения передаваемого параметра в данный контейнер, но поскольку в множестве все элементы уникальные, то count для типа set всегда возвращает 0 или 1. То есть для проверки принадлежности значения x множеству S можно использовать следующий код:

Для удаления элемента используется метод erase . Ему можно передать значение элемента, итератор, указывающий на элемент или два итератора (в этом случае удаляется целый интервал элементов, содержащийся между заданными итераторами). Вот два способа удалить элемент x :

Метод size() возвращает количество элементов в множестве, метод empty() , возвращает логическое значение, равное true , если в множестве нет элементов, метод clear() удаляет все элементы из множества.

Итераторы

С итераторами контейнера set можно выполнять операции инкремента (что означает переход к следующему элементу) и декремента (переход к предыдущему элементу). Итераторы можно сравнивать на равенство и неравенство. Операции сравнения итераторов при помощи «», «> page_code_style»>begin() , который возвращает итератор на первый элемент множества, и метод e nd() , который возвращает фиктивный итератор на элемет, следующий за последним элементом в множестве. Таким образом, вывести все элементы множества можно так:

set ::iterator it;

for (it = S.begin(); it != S.end(); ++it)

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

В стандарте C++11 разрешается перебор всех элементом множества при помощи range-based цикла:

for (auto elem: S)

Элементы также будут выведены в порядке возрастания.

Для вывода элементов в порядке убывания можно использовать reverse_iterator аналогично векторам:

for (auto it = S.rbegin(); it != S.rend(); ++it)

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

Но для удаления последнего (наибольшего) элемента в set нельзя использовать reverse_iterator, нужно взять обычный итератор, указывающий на end(), уменьшить и удалить:

auto it = S.begin();

Поиск элемента в set

Для поиска конкретного элемента в set используется метод find . Этот метод возвращает итератор на элемент, а если элемент не найден, то он возвращает итератор end() (т.е. на фиктивный элемент, следующий за последним элементом множества. Используя этот метод проверить принадлежность элемента множеству можно так:

Также есть методы lower_bound и upper_bound , которые находят первых элемент, больше или равный x и первый элемент, строго больший x (аналогично двоичному поиску элемента в массиве).

Эти методы также возвращают итераторы, а если таких элементов (больше или равных или строго больших) нет в множестве, они возвращают end() .

Например, удалить из set минимальный элемент, строго больший x можно так:

auto it = S.upper_bound(x);

Как вывести set c

Объект Set позволяет хранить уникальные значения любого типа, будь то примитивы или ссылки на объекты.

Описание

Объекты «Set» — это коллекция значений. Значение в Set может встречаться только один раз; оно уникально в коллекции. Вы можете перебирать элементы набора в порядке вставки. Порядок вставки соответствует порядку, в котором каждый элемент был успешно вставлен в коллекцию методом add() (то есть, когда был вызван add() , в наборе ещё не было такого элемента).

Спецификация требует реализации наборов, «которые в среднем обеспечивают время доступа, сублинейное количеству элементов в коллекции». Следовательно, он может быть представлен внутренне в виде хэш-таблицы (с поиском O(1)), дерева поиска (с поиском O(log(N))) или любой другой структуры данных, при условии, что сложность выше, чем O(N).

Сравнение значений

При добавлении нового элемента в Set происходит проверка, добавлялся ли такой элемент ранее. Эта проверка использует специальный алгоритм сравнения значений SameValueZero. (Раньше использовался алгоритм SameValue, в котором значения 0 и -0 считаются разными. Смотрите браузерную поддержку ниже). Это означает, что NaN считается равным NaN (не смотря на то что NaN !== NaN ), а все другие значения считаются равными в соответствии с семантикой оператора === .

Производительность

Метод has проверяет наличие значения в Set используя алгоритм, который в среднем работает быстрее поэлементного перебора добавленных ранее элементов. В частности этот алгоритм работает быстрее чем метод [ Array.prototype.includes ](/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/includes на массиве, который хранит столько же элементов сколько сравниваемый объект Set .

Конструктор

Создаёт новый объект Set .

Статические свойства

Функция-конструктор, которая используется для создания производных объектов.

Свойства экземпляра

Начальное значение @@toStringTag свойства — строка «Set» . Это значение используется в Object.prototype.toString() .

Возвращает количество значений в объекте Set .

Методы экземпляра

  • Set.prototype.add()
    • : Вставляет новый элемент с указанным значением в объект Set , если в Set ещё нет элемента с таким же значением.
    • : Удаляет все значения из объекта Set .
    • : Удаляет элемент, связанный с переданным значением, и возвращает логическое значение, подтверждающее, был ли элемент успешно удалён или нет. Set.prototype.has(value) впоследствии вернет false .
    • : Возвращает логическое значение, утверждающее, присутствует ли элемент с заданным значением в объекте Set или нет.
    • : Возвращает новый объект итератора, который выдает значения для каждого элемента в объекте Set в порядке вставки.
    • : Возвращает новый объект итератора, который выдает значения для каждого элемента в объекте Set в порядке вставки.
    • : Аналог Set.prototype.values() .
    • : Возвращает новый объект итератора, который содержит массив [value, value] для каждого элемента в объекте Set в порядке вставки.
    • : Вызывает callbackFn один раз для каждого значения, присутствующего в объекте Set в порядке вставки. Если указан параметр thisArg , он будет использоваться в качестве значения this для каждого вызова callbackFn .

    Примеры

    Использование объекта Set

    const mySet1 = new Set(); mySet1.add(1); // Set(1) mySet1.add(5); // Set(2) mySet1.add(5); // Set(2) mySet1.add("текст"); // Set(3) const o =  a: 1, b: 2 >; mySet1.add(o); mySet1.add( a: 1, b: 2 >); // o ссылается на другой объект, так что это нормально mySet1.has(1); // true mySet1.has(3); // false, поскольку 3 не был добавлен в набор mySet1.has(5); // true mySet1.has(Math.sqrt(25)); // true mySet1.has("Текст".toLowerCase()); // true mySet1.has(o); // true mySet1.size; // 5 mySet1.delete(5); // удаляет элемент 5 из set mySet1.has(5); // false, 5 был удалён mySet1.size; // 4, поскольку мы удалили одно значение mySet1.add(5); // Set(5) < 1, "текст", , , 5 > - ранее удаленный элемент будет добавлен как новый элемент, он не сохранит свое первоначальное положение до удаления console.log(mySet1); // Set(5) < 1, "текст", , , 5 > 

    Итерация по объекту Set

    Итерация наборов проходит по элементам в порядке вставки.

    for (const item of mySet1)  console.log(item); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 for (const item of mySet1.keys())  console.log(item); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 for (const item of mySet1.values())  console.log(item); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 // ключ и значение здесь одинаковы for (const [key, value] of mySet1.entries())  console.log(key); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 // Преобразуем объект Set в объект Array с помощью Array.from const myArr = Array.from(mySet1); // [1, "текст", , , 5] // следующее также будет работать, если запустить его в HTML-документе mySet1.add(document.body); mySet1.has(document.querySelector("body")); // true // преобразование между Set и Array const mySet2 = new Set([1, 2, 3, 4]); console.log(mySet2.size); // 4 console.log([. mySet2]); // [1, 2, 3, 4] // пересечение можно представить следующим образом const intersection = new Set([. mySet1].filter((x) => mySet2.has(x))); // разность можно представить следующим образом const difference = new Set([. mySet1].filter((x) => !mySet2.has(x))); // итерироваться можно с помощью forEach() mySet2.forEach((value) =>  console.log(value); >); // 1 // 2 // 3 // 4 

    Реализация базовых операций Set

    function isSuperset(set, subset)  for (const elem of subset)  if (!set.has(elem))  return false; > > return true; > function union(setA, setB)  const _union = new Set(setA); for (const elem of setB)  _union.add(elem); > return _union; > function intersection(setA, setB)  const _intersection = new Set(); for (const elem of setB)  if (setA.has(elem))  _intersection.add(elem); > > return _intersection; > function symmetricDifference(setA, setB)  const _difference = new Set(setA); for (const elem of setB)  if (_difference.has(elem))  _difference.delete(elem); > else  _difference.add(elem); > > return _difference; > function difference(setA, setB)  const _difference = new Set(setA); for (const elem of setB)  _difference.delete(elem); > return _difference; > // Примеры const setA = new Set([1, 2, 3, 4]); const setB = new Set([2, 3]); const setC = new Set([3, 4, 5, 6]); isSuperset(setA, setB); // true union(setA, setC); // Set intersection(setA, setC); // Set symmetricDifference(setA, setC); // Set difference(setA, setC); // Set 

    Связь с объектами массива

    const myArray = ["value1", "value2", "value3"]; // Используйте обычный конструктор Set для преобразования массива в набор const mySet = new Set(myArray); mySet.has("value1"); // true // Используйте синтаксис spread для преобразования набора в массив. console.log([. mySet]); // Покажет вам точно такой же массив, как и myArray 

    Удаление повторяющиеся элементов из массива

    const numbers = [2, 3, 4, 4, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 5, 32, 3, 4, 5]; console.log([. new Set(numbers)]); // [2, 3, 4, 5, 6, 7, 32] 

    Связь со строками

    const text = "Индия"; const mySet = new Set(text); // Set(5) mySet.size; // 5 // чувствительный к регистру и пропускает дубликаты new Set("Слово"); // Set(5) new Set("Слово"); // Set(4) < "С", "л", "о", "в">// "о" встречается дважды в слове, но в объекте будет только одна 

    Используйте Set для обеспечения уникальности списка значений

    const array = Array.from(document.querySelectorAll("[id]")).map((e) => e.id); const set = new Set(array); console.assert(set.size === array.length); 

    Спецификации

    Specification
    ECMAScript Language Specification
    # sec-set-objects

    Браузерная поддержка

    BCD tables only load in the browser

    Смотрите также

    Found a content problem with this page?

    • Edit the page on GitHub.
    • Report the content issue.
    • View the source on GitHub.

    This page was last modified on 8 окт. 2023 г. by MDN contributors.

    Your blueprint for a better internet.

    MDN

    Support

    • Product help
    • Report an issue

    Our communities

    Developers

    • Web Technologies
    • Learn Web Development
    • MDN Plus
    • Hacks Blog
    • Website Privacy Notice
    • Cookies
    • Legal
    • Community Participation Guidelines

    Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
    Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.

    Множества и словари в Python

    Множество ( set ) — встроенная структура данных языка Python, имеющая следующие свойства:

    • множество — это коллекция Множество содержит элементы
    • множество неупорядоченно Множество не записывает (не хранит) позиции или порядок добавления его элементов. Таким образом, множество не имеет свойств последовательности (например, массива): у элементов множества нет индексов, невозможно взять срез множества.
    • элементы множества уникальны Множество не может содержать два одинаковых элемента.
    • элементы множества — хешируемые объекты (hashable objects) В Python множество set реализовано с использованием хеш-таблицы. Это приводит к тому, что элементы множества должны быть неизменяемыми объектами. Например, элементом множества может быть строка, число, кортеж tuple , но не может быть список list , другое множество set .

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

    Создание и изменение множества

    Запустите в терминале Python в интерпретируемом режиме и проработайте примеры ниже.

    Пустое множество создаётся с помощью функции set

    >>> A = set() >>> type(A) >>> len(A) 0 >>> A set() 

    Обратите внимание, что размер множества множества можно получить с помощью функции len .

    Добавим несколько элементов

    >>> A.add(1) >>> A >>> A.add(2) >>> A >>> A.add(2) >>> A

    Заметьте, что повторное добавление не имеет никакого эффекта на множество.

    Также, из вывода видно, что литералом множества являются фигурные скобки <>, в которых через запятую указаны элементы. Так, ещё один способ создать непустое множество — воспользоваться литералом

    >>> B = 1, 2> >>> B

    При попытке добавления изменяемого объекта возникнет ошибка

    >>> B.add([3,4,5]) Traceback (most recent call last): File "", line 1, in TypeError: unhashable type: 'list' 

    Здесь произошла попытка добавить массив в множество B.

    У операции добавления set.add существует обратная — операция удаления set.remove

    >>> B >>> B.remove(1) >>> B >>> B.remove(3) Traceback (most recent call last): File "", line 1, in KeyError: 3 

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

    Однако, существует метод set.discard , который удаляет элемент из множества, только в том случае, если этот элемент присутствовал в нём.

    Математические операции

    Множества Python поддерживают привычные математические операции

    Проверки

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

    >>> B = 1, 2> >>> B >>> 3 in B False 

    Асимптотика x in set — O(1).

    Стоит отметить, что оператор in работает и с другими коллекциями. Например, можно проверять вхождение подстроки в строку ‘AA’ in ‘bbAAcc’ или вхождение элемента в массив 5 in [1, 2, 5, 6] . Асимптотики в данном случае нужно уточнять в документации.

    >>> A = 1, 2, 3> >>> B = 1, 2, 3> >>> A == B True >>> B.add(4) >>> A >>> B >>> A == B False 

    Проверка на нестрогое подмножество set.issubset

    >>> A >>> B >>> A.issubset(B) True >>> B.issubset(A) False >>> A.issubset(A) True 

    Проверка на нестрогое надмножество set.issuperset

    >>> A >>> B >>> A.issuperset(B) False >>> B.issuperset(A) True >>> B.issuperset(B) True 

    Операции получения новых множеств

    >>> A = 1, 2, 4> >>> B = 1, 2, 3> >>> A.union(B) # union — объединение множеств >>> A.intersection(B) # intersection — пересечение >>> A.difference(B) # difference — разность множеств >>> B.difference(A) >>> A.symmetric_difference(B) # symmetric_difference — симметрическая разность >>> B.symmetric_difference(A)

    Сводная таблица по множествам (cheatsheet)

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

    >>> A = 1, 2, 3, 4> >>> B = 2, 4> >>> A.difference_update(B) >>> A >>> A = 1, 2, 3, 4> >>> B = 2, 4> >>> A -= B >>> A

    Неизменяемые множества

    В Python существует неизменяемая версия множества — frozenset . Этот тип объектов поддерживает все операции обычного множества set , за исключением тех, которые его меняют.

    Неизменяемые множества являются хешируемыми объектами, поэтому они могут быть элементами множества set . Так можно реализовать, например, множество множеств, где множество set состоит из множеств типа frozenset .

    Для создания frozenset используется функция frozenset(iterable) , в качестве аргумента принимающая итерирумый объект.

    >>> FS = frozenset(1, 2, 3>) >>> FS frozenset() >>> A = 1, 2, 4> >>> FS & A frozenset() >>> A & FS

    В этом примере показано создание frozenset из обычного множества . Обратите внимание на тип возвращаемого объекта для операции пересечения & . Возвращаемый объект имеет тип, соответствующий типу первого аргумента. Такое же поведение будет и с другими операциями над множествами.

    Словари Python

    Словарь (dictionary) в Python — это ассоциативный массив, реализовать который вы пробовали на прошлом занятии. Ассоциативный массив это структура данных, содержащая пары вида ключ:значение. Ключи в ассоциативном массиве уникальны.

    В Python есть встроенный ассоциативный массив — dict . Его реализация основана на хеш-таблицах. Поэтому

    • ключом может быть только хешируемый объект
    • значением может быть любой объект

    Создание и изменение словаря

    Пустой словарь можно создать двумя способами:

    >>> d1 = dict() >>> d2 = <> >>> d1 <> >>> d2 <> >>> type(d1) >>> type(d2)

    Добавить элемент в словарь можно с помощью квадратных скобок:

    >>> domains = <> >>> domains[‘ru’] = ‘Russia’ >>> domains[‘com’] = ‘commercial’ >>> domains[‘org’] = ‘organizations’ >>> domains

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

    Доступ к элементу осуществляется по ключу:

    >>> domains['com'] 'commercial' >>> domains['de'] Traceback (most recent call last): File "", line 1, in KeyError: 'de' 

    Удалить элемент можно с помощью оператора del . Если ключа в словаре нет, произойдет ошибка KeyError

    >>> domains >>> del domains[‘de’] Traceback (most recent call last): File «», line 1, in KeyError: ‘de’ >>> del domains[‘ru’] >>> domains

    Кроме того, для добавления, получения и удаления элементов есть методы dict.setdefault , dict.get , dict.pop , которые задействует дополнительный аргумент на случай, если ключа в словаре нет

    >>> d1 = <> >>> d1.setdefault(‘a’, 10) 10 >>> d1.setdefault(‘b’, 20) 20 >>> d1 >>> d1.setdefault(‘c’) >>> d1 >>> d1.setdefault(‘a’, 123) 10 >>> d1 >>> d1.get(‘a’) 10 >>> d1.get(‘d’) # вернул None >>> d1.get(‘d’, ‘NoKey’) ‘NoKey’ >>> d1.pop(‘d’) Traceback (most recent call last): File «», line 1, in KeyError: ‘d’ >>> d1.pop(‘d’, 255) 255 >>> d1 >>> d1.pop(‘a’, 255) 10 >>> d1

    Примечание о числовых ключах

    Ключом может являться и число: int или float . Однако при работе со словарями в Python помните, что два ключа разные, если для них верно k1 != k2 # True .

    >>> d = 0: 10> >>> d >>> d[0] = 22 >>> d >>> d[0.0] = 33 >>> d >>> 0.0 != 0 False 

    Поэтому при возможности избегайте в качестве ключей float -объектов.

    Использование DictView: циклы и множественные операции

    Если попробовать пройтись в цикле по словарю, то это будет проход по ключам

    >>> d = 'a': 10, 'c': 30, 'b': 20> >>> for k in d: . print(k) . a c b 

    Зачастую необходимо пройтись в цикле по ключам, значениям или парам ключ:значение, содержащиеся в словаре. Для этого существуют методы dict.keys() , dict.values() , dict.items() . Они возвращают специальные DictView объекты, которые можно использовать в циклах:

    >>> d = 'a': 10, 'c': 30, 'b': 20> >>> for k in d.keys(): . print(k) . a c b >>> for v in d.values(): . print(v) . 10 30 20 >>> for k, v in d.items(): . print(k, v) . a 10 c 30 b 20 

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

    >>> d >>> dkeys = d.keys() >>> ‘abc’ in dkeys False >>> ‘c’ in dkeys True >>> ‘a’, ‘b’, ‘c’> == dkeys True >>> dkeys & ‘b’, ‘c’, ‘d’>

    Словарь с упорядоченными ключами OrderedDict

    Это может понадобится для отправки задач на ejudge.

    Если внимательно просмотреть примеры на циклы выше, то видно, что порядок итерирования в циклах совпадает с порядком добавления элементов в словарь.

    Однако, такое поведение у стандартных словарей dict гарантируется, начиная с версии 3.7 (лабораторные примеры были сделаны из-под версии 3.7.4). Узнать свою версию Python можно, например, из терминала python3 --version или зайдя в интерпретируемый режим (версия будет написана сверху).

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

    Она находится в стандартной библиотеке collections .

    Упорядоченный словарь поддерживает все операции, что и обычный словарь.

    >>> import collections >>> od = collections.OrderedDict() >>> od OrderedDict() >>> od['a'] = 10 >>> od['c'] = 30 >>> od['b'] = 20 >>> od OrderedDict([('a', 10), ('c', 30), ('b', 20)]) 

    Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY.

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

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