Python 使用列表和字典存储临时信息

Python 使用列表和字典存储临时信息,python,Python,我将有很多相似的对象,具有相似的参数。对象参数的示例如下所示: 名称、布尔值、数字和列表 名称必须是所有对象中唯一的值,而布尔、数字和列表参数的值不得为唯一值 我想我可以将数据存储为字典列表。就像这样: list = [ {'name':'a', 'bool':true, 'number':123, 'list':[1, 2, 3]}, {'name':'b', 'bool':false, 'number':143, 'list':[1, 3, 5]}, {'name':'c', '

我将有很多相似的对象,具有相似的参数。对象参数的示例如下所示:

名称、布尔值、数字和列表

名称必须是所有对象中唯一的值,而布尔、数字和列表参数的值不得为唯一值

我想我可以将数据存储为字典列表。就像这样:

list = [
  {'name':'a', 'bool':true, 'number':123, 'list':[1, 2, 3]},
  {'name':'b', 'bool':false, 'number':143, 'list':[1, 3, 5]},
  {'name':'c', 'bool':false, 'number':123, 'list':[1, 4, 5, 18]},
]
在我在字典列表中创建另一个字典之前,检查字典列表中是否存在唯一名称的最快方法是什么?我是否必须在列表中循环并检查列表[i][name]的值?假设不同的相似列表可能在不同的线程/任务中同时处理,并且它们的大小可能在每个列表的100到100000个字典之间,那么保存和处理该信息的最快和最节省的内存是什么呢。我应该将这些列表存储在数据库中而不是内存中吗

我明白,在项目开始工作之前,也许我不应该考虑优化(存储信息和线程),所以请先回答唯一名称查找问题:)

谢谢, Alan

如果名称是每个内部数据的实际(唯一)标识符,您也可以对外部数据使用字典:

data = {
  'a' : { 'bool':true, 'number':123, 'list':[1, 2, 3] },
  'b' : { 'bool':false, 'number':143, 'list':[1, 3, 5] },
  'c' : { 'bool':false, 'number':123, 'list':[1, 4, 5, 18] },
}
然后,您可以轻松地检查密钥是否存在


顺便说一句,不要将变量命名为
list
dict
,因为这样会覆盖内置对象。

将对象存储在以名称为键的字典中:

objects = {'a' : {'bool':true, 'number':123, 'list':[1, 2, 3]},
           'b' : {'bool':false, 'number':143, 'list':[1, 3, 5]},
           'c' : {'bool':false, 'number':123, 'list':[1, 4, 5, 18]}}
这样可以确保名称是唯一的,因为字典中的所有键都是唯一的。检查字典中的姓名也很容易:

name in objects

一旦您开始使用dict而不是列表,执行所需检查的最快方法是:

if 'newkey' not in items:
    # create a new record
因为您希望能够从多个线程访问这些记录,所以我将保留一个锁集合。顺便说一句,这是您在一开始设计的东西,因为它是应用程序设计的一部分,而不是优化

class DictLock(dict):
    def __init__(self):
        self._lock = threading.Lock()

    def __getitem__(self, key):
        # lock to prevent two threads trying to create the same
        # entry at the same time. Then they would get different locks and
        # both think that they could access the key guarded by that lock
        with self._lock:
            if key not in self.iterkeys():
                self[key] = threading.Lock()
            return super(DictLock, self).__getitem__(key)
现在,如果你想修改你的项目,你可以使用锁来保证它的安全

locks = DictLock()

with locks['a']:
    # modify a.
或插入新元素

with locks['z']:
    #we are now the only ones (playing by the rules) accessing the 'z' key
    items['z'] = create_new_item()

您需要的是一个“侵入式”字典—查找值中的键的字典。不幸的是,我不知道任何Python实现。Boost的multi_索引即将推出。

如果您不想更改现有的数据结构,那么可以使用以下方法。否则,poke的答案是正确的

>>> my_list = [
...   {'name':'a', 'bool':True, 'number':123, 'list':[1, 2, 3]},
...   {'name':'b', 'bool':False, 'number':143, 'list':[1, 3, 5]},
...   {'name':'c', 'bool':False, 'number':123, 'list':[1, 4, 5, 18]},
... ]
>>> def is_present(data, name):
...     return any(name == d["name"] for d in data)
... 
>>> is_present(my_list, "a")
True
>>> is_present(my_list, "b")
True
>>> is_present(my_list, "c")
True
>>> is_present(my_list, "d")
False
如果传递一个iterable,如果它的任何一个元素为True,它将返回True


(name==d[“name”]表示数据中的d)
创建一个生成器。每次有人(在本例中为
any
)请求下一个元素时,它都会从
数据中获取下一个元素
d
,并通过表达式
name==d[“name”]
对其进行转换。由于生成器是惰性的,即转换是在请求下一个元素时完成的,因此应该使用相对较少的内存(并且应该使用相同的内存量,而不管列表的大小)。

为什么不在对象中调用
name
而不是
bool(对象中的名称)
?我添加bool()只是为了让它更清晰,但我想情况正好相反。:-)编辑…+1以使用字典,尽管如果您的内部数据(
{'bool':true,'number':123,'list':[1,2,3]}
)总是以相同的顺序相同,我会使用列表来减少存储密集度。所以
data={'a':[true,123[1,2,3]],'b':[false,143[1,3,5]}
。不管是哪种方式,我同意最简单的检查方法就是
如果潜在的新数据输入:#做些事情
很棒!谢谢我没有尽我所能仔细阅读python文档:)哦,当然,我不会使用诸如list、dict或boolean之类的变量。我在这里使用它们只是想让你知道我计划存储什么样的数据。谢谢。dict中的新键对我来说是一种方式。谢谢你的锁。不过,我不会在多个线程中使用同一个dict。我的意思是在不同的线程中使用不同的dicts。一个线程仍然只能在同一个字典上工作。我仍然需要一种方法来跟踪不同线程的数量,这取决于大字典的处理方式,但这完全是另一个问题。再次感谢!