簡體   English   中英

根據第一部分在python中搜索元組

[英]Searching for tuples in python based on the first part

我正在使用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)

您必須遍歷集合中的所有元組並測試每個元組:

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

這里的any()函數將遍歷給定的生成器表達式,並在找到匹配項后立即短路以返回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

在Python set和dict中使用非常相似的實現:

Python集合的復雜性

而且它們都由哈希表支持。

您想做的事情不適合設定; 使用以“ 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()方法(其中一個取決於您的要求,第一個創建一個列表,第二個創建一個可迭代的列表;后者可能是對於較大的數據集來說更好,因為它使用較少的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM