哪一个更有效?
问题描述:
我有一个Python程序,用于从名称列表中删除重复项。哪一个更有效?
但是我处于两难的境地,寻找一种最有效的方法。
我已经上传了一个SQLite数据库的名称列表到一个表中的列。
无论是比较名称还是删除数据库中的重复项都不错,或者将它们加载到Python意味着将它们加载到Python并删除重复项并将它们推回到数据库是好的?
我很困惑,这里是一段代码做它的SQLite:
dup_killer (member_id, date) SELECT * FROM talks GROUP BY member_id,
答
如果您使用的名称作为数据库的密钥,数据库将确保他们不重复。所以没有理由将这个列表发送到Python并在那里重复。
如果您尚未将名称插入到数据库中,那么您最好先在Python中对它们进行重新删除。使用内置特性在Python中执行它可能会比在重复尝试插入数据库时产生的开销更快。 (顺便说一句:如果你将所有的插入包装在单个事务中,你可以真的加快插入多个名字,启动一个事务,插入所有的名字,并完成事务。确保数据库是一致的,这是多更有效地为名称的整个列表做的工作一次,而不是做一次每名。)
如果你有在Python列表中,您可以使用内置功能可以非常快速地对其进行重新设计。可用于重复删除的两个常用功能是set
和dict
。
我给了你三个例子。最简单的情况是你有一个只包含名称的列表,并且你想获得一个只有唯一名称的列表;您可以将列表放入set
。第二种情况是您的列表包含记录,并且您需要提取名称部分来构建集合。第三种情况说明如何构建将名称映射到记录上的dict
,然后将该记录插入到数据库中;如set
,dict
将只允许将唯一值用作键。当dict
被构建时,它将保持最后的值来自具有相同名称的列表。
# list already contains names
unique_names = set(list_of_all_names)
unique_list = list(unique_names) # lst now contains only unique names
# extract record field from each record and make set
unique_names = set(x.name for x in list_of_all_records)
unique_list = list(unique_names) # lst now contains only unique names
# make dict mapping name to a complete record
d = dict((x.name, x) for x in list_of_records)
# insert complete record into database using name as key
for name in d:
insert_into_database(d[name])
如果您将它们推回到数据库,您为什么不首先将它们以重复数据库的方式存储在数据库中? – spicavigo 2012-02-13 07:23:01
是@spicavigo,但代码是否正确!或者你可以让我知道具体的代码? – Beginner 2012-02-13 07:25:04
您的示例代码片段对我来说看起来并不完整。 – steveha 2012-02-13 08:38:57