Hướng dẫn ordered set in python - đặt hàng đặt trong python

Câu trả lời là không, nhưng bạn có thể sử dụng

OrderedSet[[1, 2, 3]]
6 từ thư viện tiêu chuẩn Python chỉ với các phím [và giá trị là
OrderedSet[[1, 2, 3]]
7] cho cùng một mục đích.

Nội phân chính

  • Thực hiện trên PYPI
  • Một số khác biệt
  • Không phải là câu trả lời bạn đang tìm kiếm? Duyệt các câu hỏi khác được gắn thẻ Python hoặc đặt câu hỏi của riêng bạn.

CẬP NHẬT: Kể từ Python 3.7 [và CPython 3.6], tiêu chuẩn

OrderedSet[[1, 2, 3]]
8 được đảm bảo để bảo tồn trật tự và hiệu suất hơn so với
OrderedSet[[1, 2, 3]]
9. [Tuy nhiên, để tương thích ngược và đặc biệt là khả năng đọc, bạn có thể muốn tiếp tục sử dụng
OrderedSet[[1, 2, 3]]
9.]
: As of Python 3.7 [and CPython 3.6], standard
OrderedSet[[1, 2, 3]]
8 is guaranteed to preserve order and is more performant than
OrderedSet[[1, 2, 3]]
9. [For backward compatibility and especially readability, however, you may wish to continue using
OrderedSet[[1, 2, 3]]
9.]

Dưới đây là một ví dụ về cách sử dụng

OrderedSet[[1, 2, 3]]
8 như một bộ đặt hàng để lọc ra các mục trùng lặp trong khi bảo quản thứ tự, do đó mô phỏng một bộ được đặt hàng. Sử dụng phương pháp lớp
OrderedSet[[1, 2, 3]]
8
@staticmethod
def union[*sets]:
    union = OrderedSet[]
    union.union[*sets]
    return union

def union[self, *sets]:
    for set in sets:
        self |= set
3 để tạo ra một dict, sau đó chỉ cần yêu cầu lại
@staticmethod
def union[*sets]:
    union = OrderedSet[]
    union.union[*sets]
    return union

def union[self, *sets]:
    for set in sets:
        self |= set
4.

>>> keywords = ['foo', 'bar', 'bar', 'foo', 'baz', 'foo']

>>> list[dict.fromkeys[keywords]]
['foo', 'bar', 'baz']

Asclepius

51.8K15 Huy hiệu vàng149 Huy hiệu bạc131 Huy hiệu đồng15 gold badges149 silver badges131 bronze badges

Đã trả lời ngày 6 tháng 12 năm 2018 lúc 18:21Dec 6, 2018 at 18:21

8

Có một công thức tập hợp được đặt hàng [liên kết mới có thể] cho điều này được đề cập từ tài liệu Python 2. Điều này chạy trên PY2.6 trở lên và 3.0 trở lên mà không có bất kỳ sửa đổi nào. Giao diện gần như chính xác giống như một tập bình thường, ngoại trừ việc khởi tạo nên được thực hiện với một danh sách.

OrderedSet[[1, 2, 3]]

Đây là một Mutableset, vì vậy chữ ký cho

@staticmethod
def union[*sets]:
    union = OrderedSet[]
    union.union[*sets]
    return union

def union[self, *sets]:
    for set in sets:
        self |= set
5 không khớp với SET, nhưng vì nó bao gồm
@staticmethod
def union[*sets]:
    union = OrderedSet[]
    union.union[*sets]
    return union

def union[self, *sets]:
    for set in sets:
        self |= set
6 một cái gì đó tương tự có thể dễ dàng được thêm vào:

@staticmethod
def union[*sets]:
    union = OrderedSet[]
    union.union[*sets]
    return union

def union[self, *sets]:
    for set in sets:
        self |= set

Luân Đôn

65,8K33 Huy hiệu vàng131 Huy hiệu bạc182 Huy hiệu đồng33 gold badges131 silver badges182 bronze badges

Đã trả lời ngày 31 tháng 10 năm 2009 lúc 10:15Oct 31, 2009 at 10:15

CasbashcaseBashCasebash

Huy hiệu vàng 110K8383 gold badges243 silver badges347 bronze badges

6

CẬP NHẬT: Câu trả lời này đã lỗi thời kể từ Python 3.7. Xem câu trả lời của JRC ở trên để biết giải pháp tốt hơn. Sẽ giữ câu trả lời này ở đây chỉ vì lý do lịch sử.: This answer is obsolete as of Python 3.7. See jrc's answer above for a better solution. Will keep this answer here only for historical reasons.

Một tập hợp được đặt hàng có chức năng là một trường hợp đặc biệt của một từ điển được đặt hàng.

Các chìa khóa của một từ điển là duy nhất. Do đó, nếu người ta coi thường các giá trị trong từ điển được đặt hàng [ví dụ: bằng cách gán chúng

OrderedSet[[1, 2, 3]]
7], thì về cơ bản, người ta có một tập hợp được đặt hàng.

Kể từ Python 3.1 và 2.7 có

OrderedSet[[1, 2, 3]]
6. Sau đây là một ví dụ triển khai của một đơn đặt hàng. [Lưu ý rằng chỉ có một vài phương pháp cần được xác định hoặc ghi đè:
OrderedSet[[1, 2, 3]]
6 và
import collections

class OrderedSet[collections.OrderedDict, collections.MutableSet]:

    def update[self, *args, **kwargs]:
        if kwargs:
            raise TypeError["update[] takes no keyword arguments"]

        for s in args:
            for e in s:
                 self.add[e]

    def add[self, elem]:
        self[elem] = None

    def discard[self, elem]:
        self.pop[elem, None]

    def __le__[self, other]:
        return all[e in other for e in self]

    def __lt__[self, other]:
        return self = other and self != other

    def __repr__[self]:
        return 'OrderedSet[[%s]]' % [', '.join[map[repr, self.keys[]]]]

    def __str__[self]:
        return '{%s}' % [', '.join[map[repr, self.keys[]]]]
    
    difference = property[lambda self: self.__sub__]
    difference_update = property[lambda self: self.__isub__]
    intersection = property[lambda self: self.__and__]
    intersection_update = property[lambda self: self.__iand__]
    issubset = property[lambda self: self.__le__]
    issuperset = property[lambda self: self.__ge__]
    symmetric_difference = property[lambda self: self.__xor__]
    symmetric_difference_update = property[lambda self: self.__ixor__]
    union = property[lambda self: self.__or__]
0 thực hiện việc nâng vật nặng.]

import collections

class OrderedSet[collections.OrderedDict, collections.MutableSet]:

    def update[self, *args, **kwargs]:
        if kwargs:
            raise TypeError["update[] takes no keyword arguments"]

        for s in args:
            for e in s:
                 self.add[e]

    def add[self, elem]:
        self[elem] = None

    def discard[self, elem]:
        self.pop[elem, None]

    def __le__[self, other]:
        return all[e in other for e in self]

    def __lt__[self, other]:
        return self = other and self != other

    def __repr__[self]:
        return 'OrderedSet[[%s]]' % [', '.join[map[repr, self.keys[]]]]

    def __str__[self]:
        return '{%s}' % [', '.join[map[repr, self.keys[]]]]
    
    difference = property[lambda self: self.__sub__]
    difference_update = property[lambda self: self.__isub__]
    intersection = property[lambda self: self.__and__]
    intersection_update = property[lambda self: self.__iand__]
    issubset = property[lambda self: self.__le__]
    issuperset = property[lambda self: self.__ge__]
    symmetric_difference = property[lambda self: self.__xor__]
    symmetric_difference_update = property[lambda self: self.__ixor__]
    union = property[lambda self: self.__or__]

Đã trả lời ngày 31 tháng 10 năm 2009 lúc 10:17Oct 31, 2009 at 10:17

Stephan202Stephan202Stephan202

58.3K13 Huy hiệu vàng124 Huy hiệu bạc131 Huy hiệu đồng13 gold badges124 silver badges131 bronze badges

14

Thực hiện trên PYPI

Mặc dù những người khác đã chỉ ra rằng không có việc thực hiện tích hợp bộ bảo quản đặt hàng chèn trong Python [tuy nhiên], tôi cảm thấy rằng câu hỏi này đang thiếu một câu trả lời nêu rõ những gì sẽ được tìm thấy trên PYPI.

Có các gói:

  • Đặt hàng-SET [dựa trên Python]
  • Đặt hàng [dựa trên Cython]
  • collections-extended
  • Boltons [dưới iterutils.indexedset, dựa trên Python]
  • Oset [cập nhật lần cuối vào năm 2012]

Một số triển khai này dựa trên công thức được đăng bởi Raymond Hettinger để ActiveState cũng được đề cập trong các câu trả lời khác ở đây.

Một số khác biệt

  • Không phải là câu trả lời bạn đang tìm kiếm? Duyệt các câu hỏi khác được gắn thẻ Python hoặc đặt câu hỏi của riêng bạn.
  • CẬP NHẬT: Kể từ Python 3.7 [và CPython 3.6], tiêu chuẩn
    OrderedSet[[1, 2, 3]]
    
    8 được đảm bảo để bảo tồn trật tự và hiệu suất hơn so với
    OrderedSet[[1, 2, 3]]
    
    9. [Tuy nhiên, để tương thích ngược và đặc biệt là khả năng đọc, bạn có thể muốn tiếp tục sử dụng
    OrderedSet[[1, 2, 3]]
    
    9.]
  • Dưới đây là một ví dụ về cách sử dụng
    OrderedSet[[1, 2, 3]]
    
    8 như một bộ đặt hàng để lọc ra các mục trùng lặp trong khi bảo quản thứ tự, do đó mô phỏng một bộ được đặt hàng. Sử dụng phương pháp lớp
    OrderedSet[[1, 2, 3]]
    
    8
    @staticmethod
    def union[*sets]:
        union = OrderedSet[]
        union.union[*sets]
        return union
    
    def union[self, *sets]:
        for set in sets:
            self |= set
    
    3 để tạo ra một dict, sau đó chỉ cần yêu cầu lại
    @staticmethod
    def union[*sets]:
        union = OrderedSet[]
        union.union[*sets]
        return union
    
    def union[self, *sets]:
        for set in sets:
            self |= set
    
    4.
  • Asclepius
  • 51.8K15 Huy hiệu vàng149 Huy hiệu bạc131 Huy hiệu đồng

Đã trả lời ngày 6 tháng 12 năm 2018 lúc 18:21

Có một công thức tập hợp được đặt hàng [liên kết mới có thể] cho điều này được đề cập từ tài liệu Python 2. Điều này chạy trên PY2.6 trở lên và 3.0 trở lên mà không có bất kỳ sửa đổi nào. Giao diện gần như chính xác giống như một tập bình thường, ngoại trừ việc khởi tạo nên được thực hiện với một danh sách.Apr 22, 2014 at 16:22

Đây là một Mutableset, vì vậy chữ ký cho

@staticmethod
def union[*sets]:
    union = OrderedSet[]
    union.union[*sets]
    return union

def union[self, *sets]:
    for set in sets:
        self |= set
5 không khớp với SET, nhưng vì nó bao gồm
@staticmethod
def union[*sets]:
    union = OrderedSet[]
    union.union[*sets]
    return union

def union[self, *sets]:
    for set in sets:
        self |= set
6 một cái gì đó tương tự có thể dễ dàng được thêm vào:Daniel K

Luân Đôn2 gold badges23 silver badges23 bronze badges

3

65,8K33 Huy hiệu vàng131 Huy hiệu bạc182 Huy hiệu đồng

Đã trả lời ngày 31 tháng 10 năm 2009 lúc 10:15

>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet[list[range[4]] + list[range[8]]]
>>> x
IndexedSet[[0, 1, 2, 3, 4, 5, 6, 7]]
>>> x - set[range[2]]
IndexedSet[[2, 3, 4, 5, 6, 7]]
>>> x[-1]
7
>>> fcr = IndexedSet['freecreditreport.com']
>>> ''.join[fcr[:fcr.index['.']]]
'frecditpo'

CasbashcaseBash

Huy hiệu vàng 110K83

CẬP NHẬT: Câu trả lời này đã lỗi thời kể từ Python 3.7. Xem câu trả lời của JRC ở trên để biết giải pháp tốt hơn. Sẽ giữ câu trả lời này ở đây chỉ vì lý do lịch sử.3 gold badges22 silver badges55 bronze badges

Một tập hợp được đặt hàng có chức năng là một trường hợp đặc biệt của một từ điển được đặt hàng.Feb 7, 2016 at 20:41

2

Các chìa khóa của một từ điển là duy nhất. Do đó, nếu người ta coi thường các giá trị trong từ điển được đặt hàng [ví dụ: bằng cách gán chúng

OrderedSet[[1, 2, 3]]
7], thì về cơ bản, người ta có một tập hợp được đặt hàng.

Kể từ Python 3.1 và 2.7 có

OrderedSet[[1, 2, 3]]
6. Sau đây là một ví dụ triển khai của một đơn đặt hàng. [Lưu ý rằng chỉ có một vài phương pháp cần được xác định hoặc ghi đè:
OrderedSet[[1, 2, 3]]
6 và
import collections

class OrderedSet[collections.OrderedDict, collections.MutableSet]:

    def update[self, *args, **kwargs]:
        if kwargs:
            raise TypeError["update[] takes no keyword arguments"]

        for s in args:
            for e in s:
                 self.add[e]

    def add[self, elem]:
        self[elem] = None

    def discard[self, elem]:
        self.pop[elem, None]

    def __le__[self, other]:
        return all[e in other for e in self]

    def __lt__[self, other]:
        return self = other and self != other

    def __repr__[self]:
        return 'OrderedSet[[%s]]' % [', '.join[map[repr, self.keys[]]]]

    def __str__[self]:
        return '{%s}' % [', '.join[map[repr, self.keys[]]]]
    
    difference = property[lambda self: self.__sub__]
    difference_update = property[lambda self: self.__isub__]
    intersection = property[lambda self: self.__and__]
    intersection_update = property[lambda self: self.__iand__]
    issubset = property[lambda self: self.__le__]
    issuperset = property[lambda self: self.__ge__]
    symmetric_difference = property[lambda self: self.__xor__]
    symmetric_difference_update = property[lambda self: self.__ixor__]
    union = property[lambda self: self.__or__]
0 thực hiện việc nâng vật nặng.]

pip install sortedcontainers

Đã trả lời ngày 31 tháng 10 năm 2009 lúc 10:17

58.3K13 Huy hiệu vàng124 Huy hiệu bạc131 Huy hiệu đồng

from sortedcontainers import SortedSet
help[SortedSet]

Mặc dù những người khác đã chỉ ra rằng không có việc thực hiện tích hợp bộ bảo quản đặt hàng chèn trong Python [tuy nhiên], tôi cảm thấy rằng câu hỏi này đang thiếu một câu trả lời nêu rõ những gì sẽ được tìm thấy trên PYPI.

Có các gói:

Đặt hàng-SET [dựa trên Python]Sep 23, 2014 at 6:52

Đặt hàng [dựa trên Cython]GrantJ

Boltons [dưới iterutils.indexedset, dựa trên Python]3 gold badges49 silver badges45 bronze badges

6

Như các câu trả lời khác đã đề cập, như đối với Python 3.7+, Dict được đặt hàng theo định nghĩa. Thay vì phân lớp

OrderedSet[[1, 2, 3]]
9, chúng ta có thể phân lớp
>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet[list[range[4]] + list[range[8]]]
>>> x
IndexedSet[[0, 1, 2, 3, 4, 5, 6, 7]]
>>> x - set[range[2]]
IndexedSet[[2, 3, 4, 5, 6, 7]]
>>> x[-1]
7
>>> fcr = IndexedSet['freecreditreport.com']
>>> ''.join[fcr[:fcr.index['.']]]
'frecditpo'
3 hoặc
>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet[list[range[4]] + list[range[8]]]
>>> x
IndexedSet[[0, 1, 2, 3, 4, 5, 6, 7]]
>>> x - set[range[2]]
IndexedSet[[2, 3, 4, 5, 6, 7]]
>>> x[-1]
7
>>> fcr = IndexedSet['freecreditreport.com']
>>> ''.join[fcr[:fcr.index['.']]]
'frecditpo'
4 bằng các khóa của Dict để lưu trữ các giá trị của chúng ta.

import itertools
import typing

T = typing.TypeVar["T"]

class OrderedSet[typing.MutableSet[T]]:
    """A set that preserves insertion order by internally using a dict."""

    def __init__[self, iterable: typing.Iterator[T]]:
        self._d = dict.fromkeys[iterable]

    def add[self, x: T] -> None:
        self._d[x] = None

    def discard[self, x: T] -> None:
        self._d.pop[x, None]

    def __contains__[self, x: object] -> bool:
        return self._d.__contains__[x]

    def __len__[self] -> int:
        return self._d.__len__[]

    def __iter__[self] -> typing.Iterator[T]:
        return self._d.__iter__[]

    def __str__[self]:
        return f"{{{', '.join[str[i] for i in self]}}}"

    def __repr__[self]:
        return f""

Sau đó chỉ:

x = OrderedSet[[1, 2, -1, "bar"]]
x.add[0]
assert list[x] == [1, 2, -1, "bar", 0]

Tôi đã thêm mã này, với một số bài kiểm tra, trong một thư viện nhỏ, vì vậy bất cứ ai cũng có thể

>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet[list[range[4]] + list[range[8]]]
>>> x
IndexedSet[[0, 1, 2, 3, 4, 5, 6, 7]]
>>> x - set[range[2]]
IndexedSet[[2, 3, 4, 5, 6, 7]]
>>> x[-1]
7
>>> fcr = IndexedSet['freecreditreport.com']
>>> ''.join[fcr[:fcr.index['.']]]
'frecditpo'
1.

Đã trả lời ngày 26 tháng 5 năm 2020 lúc 10:09May 26, 2020 at 10:09

Bustawinbustawinbustawin

6247 Huy hiệu bạc11 Huy hiệu đồng7 silver badges11 bronze badges

2

Trong trường hợp bạn đã sử dụng gấu trúc trong mã của mình, đối tượng

>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet[list[range[4]] + list[range[8]]]
>>> x
IndexedSet[[0, 1, 2, 3, 4, 5, 6, 7]]
>>> x - set[range[2]]
IndexedSet[[2, 3, 4, 5, 6, 7]]
>>> x[-1]
7
>>> fcr = IndexedSet['freecreditreport.com']
>>> ''.join[fcr[:fcr.index['.']]]
'frecditpo'
6 của nó hoạt động khá giống như một tập hợp được đặt hàng, như thể hiện trong bài viết này.

Ví dụ từ bài viết:

indA = pd.Index[[1, 3, 5, 7, 9]]
indB = pd.Index[[2, 3, 5, 7, 11]]

indA & indB  # intersection
indA | indB  # union
indA - indB  # difference
indA ^ indB  # symmetric difference

Đã trả lời ngày 25 tháng 9 năm 2015 lúc 14:13Sep 25, 2015 at 14:13

Berislav Lopacberislav LopacBerislav Lopac

15.8k6 huy hiệu vàng68 Huy hiệu bạc78 Huy hiệu đồng6 gold badges68 silver badges78 bronze badges

3

Không có

>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet[list[range[4]] + list[range[8]]]
>>> x
IndexedSet[[0, 1, 2, 3, 4, 5, 6, 7]]
>>> x - set[range[2]]
IndexedSet[[2, 3, 4, 5, 6, 7]]
>>> x[-1]
7
>>> fcr = IndexedSet['freecreditreport.com']
>>> ''.join[fcr[:fcr.index['.']]]
'frecditpo'
7 trong thư viện chính thức. Tôi thực hiện một cheating đầy đủ của tất cả các cấu trúc dữ liệu để bạn tham khảo.

OrderedSet[[1, 2, 3]]
0

FHDRSDG

9.8072 Huy hiệu vàng37 Huy hiệu bạc58 Huy hiệu Đồng2 gold badges37 silver badges58 bronze badges

Đã trả lời ngày 6 tháng 12 năm 2017 lúc 10:50Dec 6, 2017 at 10:50

AbstprocdoabstprocdoAbstProcDo

18.3K14 Huy hiệu vàng70 Huy hiệu bạc122 Huy hiệu đồng14 gold badges70 silver badges122 bronze badges

1

Như những người khác đã nói,

OrderedSet[[1, 2, 3]]
9 là một superset của một tập hợp được đặt hàng về mặt chức năng, nhưng nếu bạn cần một bộ để tương tác với API và không cần phải thay đổi,
>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet[list[range[4]] + list[range[8]]]
>>> x
IndexedSet[[0, 1, 2, 3, 4, 5, 6, 7]]
>>> x - set[range[2]]
IndexedSet[[2, 3, 4, 5, 6, 7]]
>>> x[-1]
7
>>> fcr = IndexedSet['freecreditreport.com']
>>> ''.join[fcr[:fcr.index['.']]]
'frecditpo'
9 thực sự là một triển khai
pip install sortedcontainers
0:

OrderedSet[[1, 2, 3]]
1

Các cảnh báo là bất biến và phải xây dựng bộ giống như một dict, nhưng nó đơn giản và chỉ sử dụng các bản dựng.

Đã trả lời ngày 2 tháng 9 năm 2020 lúc 2:33Sep 2, 2020 at 2:33

David Ehrmanndavid EhrmannDavid Ehrmann

7.1661 Huy hiệu vàng28 Huy hiệu bạc37 Huy hiệu đồng1 gold badge28 silver badges37 bronze badges

Gói song song cung cấp một lớp tập hợp được đặt hàng SetList [] hoàn chỉnh phương thức hơn so với các tùy chọn dựa trên công thức ActiveState. Nó hỗ trợ tất cả các phương thức có sẵn cho danh sách và hầu hết nếu không phải tất cả các phương thức có sẵn cho các bộ.

Đã trả lời ngày 21 tháng 1 năm 2017 lúc 22:45Jan 21, 2017 at 22:45

Có một thư viện PIP làm điều này:

OrderedSet[[1, 2, 3]]
2

Sau đó, bạn có thể sử dụng nó:

OrderedSet[[1, 2, 3]]
3

Đã trả lời ngày 4 tháng 4 lúc 20:04Apr 4 at 20:04

Watchdog101Watchdog101Watchdog101

5904 Huy hiệu bạc17 Huy hiệu đồng4 silver badges17 bronze badges

Đối với nhiều mục đích chỉ đơn giản là gọi sắp xếp sẽ đủ. Ví dụ

OrderedSet[[1, 2, 3]]
4

Nếu bạn sẽ sử dụng điều này nhiều lần, sẽ có chi phí phát sinh bằng cách gọi chức năng được sắp xếp để bạn có thể muốn lưu danh sách kết quả, miễn là bạn đã thay đổi xong. Nếu bạn cần duy trì các yếu tố duy nhất và được sắp xếp, tôi đồng ý với đề xuất sử dụng OrderedDict từ các bộ sưu tập có giá trị tùy ý như không có.

Đã trả lời ngày 20 tháng 2 năm 2013 lúc 22:52Feb 20, 2013 at 22:52

HWRDHWRDhwrd

4154 Huy hiệu bạc7 Huy hiệu đồng4 silver badges7 bronze badges

1

Vì vậy, tôi cũng có một danh sách nhỏ trong đó tôi rõ ràng có khả năng giới thiệu các giá trị không duy nhất.

Tôi đã tìm kiếm sự tồn tại của một danh sách duy nhất của một số loại, nhưng sau đó nhận ra rằng việc kiểm tra sự tồn tại của phần tử trước khi thêm nó hoạt động tốt.

OrderedSet[[1, 2, 3]]
5

Tôi không biết nếu có những cảnh báo cho cách tiếp cận đơn giản này, nhưng nó giải quyết được vấn đề của tôi.

Đã trả lời ngày 16 tháng 7 năm 2018 lúc 2:40Jul 16, 2018 at 2:40

Loïc N.Loïc N.Loïc N.

3133 Huy hiệu bạc16 Huy hiệu Đồng3 silver badges16 bronze badges

1

Không phải là câu trả lời bạn đang tìm kiếm? Duyệt các câu hỏi khác được gắn thẻ Python hoặc đặt câu hỏi của riêng bạn.

Bài Viết Liên Quan

Chủ Đề