Доступ к элементам в списке наборов (Python) [дубликат]

Вы можете это сделать, но это требует немного взлома. К счастью, теперь есть модуль, называемый «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)

, и вам хорошо идти! Существует также функция «обратного» удаления исправленного метода.

54
задан 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 27 August 2018 в 07:26
поделиться

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

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

Основываясь на ответе Свена, я нашел использование коллекций. Такой способ помог мне выполнить то, что вы хотите, и позволить мне добавить больше элементов в 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 27 August 2018 в 07:26
поделиться

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

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

# 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 27 August 2018 в 07:26
поделиться

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

13
ответ дан Michael Mior 27 August 2018 в 07:26
поделиться

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

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.

0
ответ дан Mike Stucka 27 August 2018 в 07:26
поделиться

В 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 27 August 2018 в 07:26
поделиться
Другие вопросы по тегам:

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