基于第一部分在python中搜索元组

时间:2015-03-05 09:47:37

标签: python set

我正在使用python的set类。该集包含元组(id,name)。给定一个id我如何检查它是否与集合中已经存在的那个相对应并执行:

if id is not in the set by searching the tuples
add a new tuple (id,name) in the set

我正在使用集合,因为它们应该使用比列表更高效的哈希表,并且我处理大量数据(超过50GB)

2 个答案:

答案 0 :(得分:1)

你必须遍历集合中的所有元组并测试每个元组:

if not any(t[0] == id for t in tuple_set):
    tuple_set.add((id, some_name))

此处的any() function会迭代给定的生成器表达式,并在找到匹配项后立即短路返回True

如果你的元组总是基于第一个元素是唯一的,那么你可能想要使用一个实现__eq____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

答案 1 :(得分:0)

Python set和dict中的

使用非常类似的实现:

Python collections complexity

他们都有哈希表支持。

你想做的事情不适合设定;使用带有&#34; id&#34;的词典作为关键和&#34;名称&#34;作为值,并使用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()方法(哪一个取决于你的要求,第一个创建一个列表,第二个是可迭代的;对于非常大的数据集,后者可能更好,因为它使用更少的内存。)