有人认为使用 Python 合并两个数据集的最有效方法是什么?
一些背景知识 - 此代码将采用以下格式获取 100K+ 条记录:
{user: aUser, transaction: UsersTransactionNumber}, ...
并使用以下数据
{transaction: aTransactionNumber, activationNumber: assoiciatedActivationNumber}, ...
创造
{user: aUser, activationNumber: assoiciatedActivationNumber}, ...
N.B 这些不是 Python 字典,只是最接近干净地描述记录格式的东西。
所以从理论上讲,我要做的就是创建一个 View ,让两个列表(或表)连接到一个公共(public)键上——起初这让我转向集合(联合等),但在我开始深入学习这些之前,他们是要走的路吗?到目前为止,我觉得这可以实现为:
创建字典列表并遍历列表,每次比较键,但是,最坏的情况可能会达到 len(inputDict)*len(outputDict) <- 不确定?
将数据作为内存中的 SQLite 表进行操作?最好不要,虽然对 Python 2.4 没有严格要求,但它会让生活更轻松。
某种基于集合的魔法?
澄清
这个脚本的全部目的是总结,实际数据集来自两个不同的来源。用户和交易编号以 CSV 的形式出现,作为测试电子邮件激活代码吞吐量的性能测试的输出。第二个数据集来自解析测试邮箱,其中包含交易 ID 和激活码。然后,该测试的输出是一个 CSV,它将被送回性能测试的第 2 阶段,使用配对的激活码激活用户帐户。
如果我对记录的注释有误导性,我深表歉意,我已经相应地更新了它们。
感谢您的回复,我将尝试两个想法:
- 首先对列表进行排序(我不知道 这是多么昂贵)
- 创建一个 带有交易代码的字典 作为 key 然后存储用户和 列表中的激活码作为 值(value)
性能对我来说并不是最重要的,我只是想尝试在我的 Python 编程中养成良好的习惯。
请您参考如下方法:
这是一种激进的方法。
不要。
您有两个 CSV 文件;一个(用户)显然是司机。别管这个了。 另一个——用户的交易代码——可以变成一个简单的字典。
除非绝对必要,否则不要“组合”或“加入”任何东西。当然不要“合并”或“预加入”。
编写您的应用程序只是在其他集合中进行简单的查找。
Create a list of dictionaries and iterate over the list comparing the key each time,
关闭。看起来像这样。注意:没有排序。
import csv
with open('activations.csv','rb') as act_data:
rdr= csv.DictReader( act_data)
activations = dict( (row['user'],row) for row in rdr )
with open('users.csv','rb') as user_data:
rdr= csv.DictReader( user_data )
with open( 'users_2.csv','wb') as updated_data:
wtr= csv.DictWriter( updated_data, ['some','list','of','columns'])
for user in rdr:
user['some_field']= activations[user['user_id_column']]['some_field']
wtr.writerow( user )
这既快速又简单。保存字典(使用 shelve 或 pickle)。
however, worst case scenario this could run up to len(inputDict)*len(outputDict) <- Not sure?
错了。
一个列表是“驱动”列表。另一个是查找列表。您将通过遍历用户并查找适当的事务值来驱动。这是用户列表中的 O( n ) 个用户。查找是 O( 1 ) 因为字典是散列。
