根据第一部分在 python 中搜索元组
Searching for tuples in python based on the first part
我正在使用 python 的套装 class。该集合包含元组 (id,name)
。给定一个 id,我如何检查它是否对应于集合中已有的一个并执行:
if id is not in the set by searching the tuples
add a new tuple (id,name) in the set
我正在使用集合,因为它们应该使用比列表更有效的哈希表,而且我正在处理大量数据(超过 50GB)
您必须遍历集合中的 所有 个元组并测试每个元组:
if not any(t[0] == id for t in tuple_set):
tuple_set.add((id, some_name))
此处的 any()
function 将遍历给定的生成器表达式,并在找到匹配项后立即短路到 return True
。
如果您的元组总是基于第一个元素是唯一的,那么您可能想要使用实现 __eq__
and __hash__
:
的自定义 class
class Entry(object):
__slots__ = ('id', 'name') # save some memory
def __init__(self, id, name):
self.id = id
self.name = name
def __eq__(self, other):
if not isinstance(other, Entry): return NotImplemented
return self.id == other.id
def __hash__(self):
return id(self.id)
def __repr__(self):
return '<{0}({1[0]!r}, {1[1]!r})>'.format(type(self).__name__, self)
def __getitem__(self, index):
return getattr(self, ('id', 'name')[index])
然后使用一组中的那些,之后你可以使用:
if Entry(id, some_name) in entries_set:
演示:
>>> entries_set = {Entry('foo', 'bar'), Entry('foo', 'baz')}
>>> entries_set
set([<Entry('foo', 'baz')>])
>>> Entry('foo', 'spam') in entries_set
True
另一种选择是将 ID 映射到 字典 中的名称;字典是具有以下值的集合:
id_value_dictionary = {'id1': 'name1', 'id2': 'name2'}
if id not in id_value_dictionary:
id_value_dictionary[id] = some_name
在 Python set 和 dict 使用非常相似的实现:
而且它们都由哈希表支持。
你想做的不适合设置;使用带有 "id" 作为键和 "name" 作为值的字典,并使用 setdefault 方法:
#!/usr/bin/python
d = {"a": 1, "b": 2, "c": 3}
d.setdefault("a", 5) # a will retain its original value
d.setdefault("d", 9) # the d key will be inserted with the passed value
为了得到你想要的键值元组,你可以使用 items() 或 iteritems() 方法(哪个取决于你的要求,第一个创建一个列表,第二个可迭代; 后者可能更适合非常大的数据集,因为它使用的内存更少)。
我正在使用 python 的套装 class。该集合包含元组 (id,name)
。给定一个 id,我如何检查它是否对应于集合中已有的一个并执行:
if id is not in the set by searching the tuples
add a new tuple (id,name) in the set
我正在使用集合,因为它们应该使用比列表更有效的哈希表,而且我正在处理大量数据(超过 50GB)
您必须遍历集合中的 所有 个元组并测试每个元组:
if not any(t[0] == id for t in tuple_set):
tuple_set.add((id, some_name))
此处的 any()
function 将遍历给定的生成器表达式,并在找到匹配项后立即短路到 return True
。
如果您的元组总是基于第一个元素是唯一的,那么您可能想要使用实现 __eq__
and __hash__
:
class Entry(object):
__slots__ = ('id', 'name') # save some memory
def __init__(self, id, name):
self.id = id
self.name = name
def __eq__(self, other):
if not isinstance(other, Entry): return NotImplemented
return self.id == other.id
def __hash__(self):
return id(self.id)
def __repr__(self):
return '<{0}({1[0]!r}, {1[1]!r})>'.format(type(self).__name__, self)
def __getitem__(self, index):
return getattr(self, ('id', 'name')[index])
然后使用一组中的那些,之后你可以使用:
if Entry(id, some_name) in entries_set:
演示:
>>> entries_set = {Entry('foo', 'bar'), Entry('foo', 'baz')}
>>> entries_set
set([<Entry('foo', 'baz')>])
>>> Entry('foo', 'spam') in entries_set
True
另一种选择是将 ID 映射到 字典 中的名称;字典是具有以下值的集合:
id_value_dictionary = {'id1': 'name1', 'id2': 'name2'}
if id not in id_value_dictionary:
id_value_dictionary[id] = some_name
在 Python set 和 dict 使用非常相似的实现:
而且它们都由哈希表支持。
你想做的不适合设置;使用带有 "id" 作为键和 "name" 作为值的字典,并使用 setdefault 方法:
#!/usr/bin/python
d = {"a": 1, "b": 2, "c": 3}
d.setdefault("a", 5) # a will retain its original value
d.setdefault("d", 9) # the d key will be inserted with the passed value
为了得到你想要的键值元组,你可以使用 items() 或 iteritems() 方法(哪个取决于你的要求,第一个创建一个列表,第二个可迭代; 后者可能更适合非常大的数据集,因为它使用的内存更少)。