2012-02-13 51 views
1

我有一个Python程序,用于从名称列表中删除重复项。哪一个更有效?

但是我处于两难的境地,寻找一种最有效的方法。

我已经上传了一个SQLite数据库的名称列表到一个表中的列。

无论是比较名称还是删除数据库中的重复项都不错,或者将它们加载到Python意味着将它们加载到Python并删除重复项并将它们推回到数据库是好的?

我很困惑,这里是一段代码做它的SQLite:

dup_killer (member_id, date) SELECT * FROM talks GROUP BY member_id, 
+1

如果您将它们推回到数据库,您为什么不首先将它们以重复数据库的方式存储在数据库中? – spicavigo 2012-02-13 07:23:01

+0

是@spicavigo,但代码是否正确!或者你可以让我知道具体的代码? – Beginner 2012-02-13 07:25:04

+1

您的示例代码片段对我来说看起来并不完整。 – steveha 2012-02-13 08:38:57

回答

3

如果您使用的名称作为数据库的密钥,数据库将确保他们不重复。所以没有理由将这个列表发送到Python并在那里重复。

如果您尚未将名称插入到数据库中,那么您最好先在Python中对它们进行重新删除。使用内置特性在Python中执行它可能会比在重复尝试插入数据库时​​产生的开销更快。 (顺便说一句:如果你将所有的插入包装在单个事务中,你可以真的加快插入多个名字,启动一个事务,插入所有的名字,并完成事务。确保数据库是一致的,这是更有效地为名称的整个列表做的工作一次,而不是做一次每名。)

如果你有在Python列表中,您可以使用内置功能可以非常快速地对其进行重新设计。可用于重复删除的两个常用功能是setdict

我给了你三个例子。最简单的情况是你有一个只包含名称的列表,并且你想获得一个只有唯一名称的列表;您可以将列表放入set。第二种情况是您的列表包含记录,并且您需要提取名称部分来构建集合。第三种情况说明如何构建将名称映射到记录上的dict,然后将该记录插入到数据库中;如setdict将只允许将唯一值用作键。当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]) 
+0

您的任何方法都不会保留列表的原始顺序。这可能没有关系,但是如果它有'unique_names = list(OrderedDict.fromkeys(list_of_all_names))'将保留每个名字的第一次出现。 – Duncan 2012-02-13 10:00:55

+0

@Duncan,如果保留插入到数据库表中名称的顺序非常重要,我会感到非常惊讶。但我喜欢那个技巧,我会记住它。感谢分享它。 – steveha 2012-02-13 22:10:50