gpt4 book ai didi

python - 有没有办法在 O(1) 时间内从集合中获取项目?

转载 作者:太空狗 更新时间:2023-10-29 22:09:52 27 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Python: Retrieve items from a set

考虑以下代码:

>>> item1 = (1,)
>>> item2 = (2,)
>>> s = set([item1, item2])
>>> s
set([(2,), (1,)])
>>> new_item = (1,)
>>> new_item in s
True
>>> new_item == item1
True
>>> new_item is item1
False

所以 new_items 中,因为它等同于它的一个项目,但它是一个不同的对象。

我想要的是从 s 中获取 item1,因为 new_items 中。

我想出的一个解决方案很简单但效率不高:

def get_item(s, new_item):
for item in s:
if item == new_item:
return item

>>> get_item(s, new_item) is new_item
False
>>> get_item(s, new_item) is item1
True

另一种解决方案似乎更有效但实际上不起作用:

 def get_item_using_intersection1(s, new_item):
return set([new_item]).intersection(s).pop()

也不是这个:

 def get_item_using_intersection2(s, new_item):
return s.intersection(set([new_item])).pop()

因为交集以一种未定义的方式工作:

>>> get_item_using_intersection1(s, new_item) is new_item
True
>>> get_item_using_intersection1(s, new_item) is item1
False

>>> get_item_using_intersection2(s, new_item) is new_item
True
>>> get_item_using_intersection2(s, new_item) is item1
False

如果这很重要,我在 Windows 7 上使用 Python 2.7 x64,但我需要一个跨平台的解决方案。


谢谢大家。我想出了以下临时解决方案:

class SearchableSet(set):

def find(self, item):
for e in self:
if e == item:
return e

将来会用以下解决方案替换(目前还很不完整):

class SearchableSet(object):

def __init__(self, iterable=None):
self.__data = {}
if iterable is not None:
for e in iterable:
self.__data[e] = e

def __iter__(self):
return iter(self.__data)

def __len__(self):
return len(self.__data)

def __sub__(self, other):
return SearchableSet(set(self).__sub__(set(other)))

def add(self, item):
if not item in self:
self.__data[item] = item

def find(self, item):
return self.__data.get(item)

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com