Вы можете это сделать, но это требует немного взлома. К счастью, теперь есть модуль, называемый «Forbidden Fruit», который дает вам возможность исправлять методы встроенных типов очень просто. Вы можете найти его в
http://clarete.github.io/forbiddenfruit/?goback=.gde_50788_member_228887816
или
https://pypi.python.org/pypi/forbiddenfruit/0.1.0
С исходным вопросом вопроса после того, как вы напишете функцию «should_equal», вы просто сделайте
from forbiddenfruit import curse
curse(int, "should_equal", should_equal)
, и вам хорошо идти! Существует также функция «обратного» удаления исправленного метода.
set
является неупорядоченной структурой данных. set
, а скорее collections.OrderedDict
: >>> a = collections.OrderedDict.fromkeys([1, 2, 20, 6, 210])
>>> b = collections.OrderedDict.fromkeys([6, 20, 1])
>>> collections.OrderedDict.fromkeys(x for x in a if x not in b)
OrderedDict([(2, None), (210, None)])
Обратите внимание, что порядок b
не имеет значения, поэтому он может быть любым итерабельным, но должен быть итерабельным, который поддерживает тесты на членство O (1). Изменить: В приведенном выше ответе предполагается, что вы хотите выполнять (упорядоченно) заданные операции во всех встречающихся коллекциях, в частности, также и в результате предыдущей заданной операции. Если это не обязательно, вы можете просто использовать списки для некоторых коллекций и устанавливать для других, например
>>> a = [1, 2, 20, 6, 210]
>>> b = set([6, 20, 1])
>>> [x for x in a if x not in b]
[2, 210]
. Это теряет порядок b
, не позволяет быстро проверять членство в a
и результат. Наборы позволяют быстро проверять членство, а списки сохраняют порядок. Если вам нужны обе эти функции в одной коллекции, используйте collections.OrderedDict
.
Вот простой способ сделать это:
x=[1,2,20,6,210]
print sorted(set(x))
Основываясь на ответе Свена, я нашел использование коллекций. Такой способ помог мне выполнить то, что вы хотите, и позволить мне добавить больше элементов в dict:
import collections
x=[1,2,20,6,210]
z=collections.OrderedDict.fromkeys(x)
z
OrderedDict([(1, None), (2, None), (20, None), (6, None), (210, None)])
Если вы хотите добавить элементы, но все еще рассматривайте его как набор, который вы можете просто сделать:
z['nextitem']=None
И вы можете выполнить операцию типа z.keys () на dict и получить набор:
z.keys()
[1, 2, 20, 6, 210]
Как указано в других ответах, наборы представляют собой структуры данных (и математические концепции), которые не сохраняют порядок элементов -
Однако, используя комбинацию множеств и словарей, возможно, что вы можете добиваться того, что вы хотите - попробуйте использовать эти фрагменты:
# save the element order in a dict:
x_dict = dict(x,y for y, x in enumerate(my_list) )
x_set = set(my_list)
#perform desired set operations
...
#retrieve ordered list from the set:
new_list = [None] * len(new_set)
for element in new_set:
new_list[x_dict[element]] = element
Отвечая на ваш первый вопрос, набор представляет собой структуру данных, оптимизированную для заданных операций. Подобно математическому набору, он не обеспечивает или не поддерживает какой-либо конкретный порядок элементов. Абстрактная концепция набора не обеспечивает порядок, поэтому для реализации не требуется. Когда вы создаете набор из списка, Python имеет право изменять порядок элементов для нужд внутренней реализации, которые он использует для набора, который может эффективно выполнять заданные операции.
Реализация концепции с наивысшей оценкой выше, которая возвращает ее в список:
def SetOfListInOrder(incominglist):
from collections import OrderedDict
outtemp = OrderedDict()
for item in incominglist:
outtemp[item] = None
return(list(outtemp))
Протестировано (кратко) на Python 3.6 и Python 2.7.
В Python 3.6, set()
теперь должен сохранить порядок, но есть другое решение для Python 2 и 3:
>>> x = [1, 2, 20, 6, 210]
>>> sorted(set(x), key=x.index)
[1, 2, 20, 6, 210]