2012-02-13 117 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