可能性の重複:
Python: Retrieve items from a setO(1)時間にセットからアイテムを取得する方法はありますか?
次のコードを考えてみましょう:
>>> 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
をだから、その項目の1に相当しますので、new_item
はs
であるが、それはあります別のオブジェクト。
item1
はs
からnew_item
に、s
になります。私が出ている
一つの解決策は、非常に効率的に簡単ではなく、次のとおりです。
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()
も、この1:
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)
...あなたが思いついた "非効率的な解決策"は、すでに線形です。 – kennytm
私は彼が*定数*時間を意味すると思う –
@ケニーTM、ありがとう、私は私の質問のタイトルを編集しました。 – utapyngo