Python: преобразование списка для установки [duplicate]

Что именно вы подразумеваете под патчем Monkey здесь? Есть несколько несколько разных определений .

Если вы имеете в виду, «можете ли вы изменить методы класса во время выполнения?», Тогда ответ решительно да:

class Foo:
  pass # dummy class

Foo.bar = lambda self: 42

x = Foo()
print x.bar()

Если вы имеете в виду: «Можете ли вы изменить методы класса во время выполнения и сделать все экземпляры этого класса после факта?» тогда и ответ да. Просто немного измените порядок:

class Foo:
  pass # dummy class

x = Foo()

Foo.bar = lambda self: 42

print x.bar()

Но вы не можете сделать это для определенных встроенных классов, например int или float. Эти методы классов реализованы в C, и некоторые абстракции пожертвованы, чтобы сделать реализацию проще и эффективнее.

Я не совсем понимаю, почему вы хотели бы изменить поведение встроенного - В числовых классах все равно. Если вам нужно изменить свое поведение, подклассируйте их !!

56
задан Kevin Guan 15 January 2016 в 05:59
поделиться

7 ответов

  1. A set является неупорядоченной структурой данных.
  2. Не используйте 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.

59
ответ дан tsherwen 5 September 2018 в 08:43
поделиться

Вот простой способ сделать это:

x=[1,2,20,6,210]
print sorted(set(x))
-7
ответ дан dorukayhan 5 September 2018 в 08:43
поделиться

Основываясь на ответе Свена, я нашел использование коллекций. Такой способ помог мне выполнить то, что вы хотите, и позволить мне добавить больше элементов в 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]
1
ответ дан jimh 5 September 2018 в 08:43
поделиться

Как указано в других ответах, наборы представляют собой структуры данных (и математические концепции), которые не сохраняют порядок элементов -

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

# 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
3
ответ дан jsbueno 5 September 2018 в 08:43
поделиться

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

13
ответ дан Michael Mior 5 September 2018 в 08:43
поделиться

Реализация концепции с наивысшей оценкой выше, которая возвращает ее в список:

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.

1
ответ дан Mike Stucka 5 September 2018 в 08:43
поделиться

В Python 3.6, set() теперь должен сохранить порядок, но есть другое решение для Python 2 и 3:

>>> x = [1, 2, 20, 6, 210]
>>> sorted(set(x), key=x.index)
[1, 2, 20, 6, 210]
17
ответ дан Tiger-222 5 September 2018 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: