有效地合并Python中的两个数据集

Tom*_*ner 1 python performance data-structures

有什么人会考虑使用Python合并两个数据集的最有效方法?

一点背景 - 此代码将采用以下格式的100K +记录:

{user: aUser, transaction: UsersTransactionNumber}, ...
Run Code Online (Sandbox Code Playgroud)

并使用以下数据

{transaction: aTransactionNumber, activationNumber: assoiciatedActivationNumber}, ...
Run Code Online (Sandbox Code Playgroud)

创造

{user: aUser, activationNumber: assoiciatedActivationNumber}, ...
Run Code Online (Sandbox Code Playgroud)

注意:这些不是Python词典,只是最接近干净地描绘记录格式的东西.

所以从理论上讲,我所要做的就是创建一个两个列表(或表)加入一个公共密钥的视图 - 首先这指向集合(工会等),但在我开始深入学习这些之前,是不是要走的路?到目前为止,我觉得这可以实现为:

  1. 创建一个字典列表并迭代列表,每次比较密钥,但是,最坏的情况可能会运行到len(inputDict)*len(outputDict)< - 不确定?

  2. 将数据作为内存中的SQLite表进行操作?虽然对Python 2.4没有严格要求,但它可以让生活更轻松.

  3. 某种基于Set的魔法?

澄清

该脚本的总体目的是总结,实际数据集来自两个不同的来源.用户和交易号以CSV的形式出现,作为测试电子邮件激活码吞吐量的性能测试的输出.第二个数据集来自解析测试邮箱,其中包含事务ID和激活码.然后,此测试的输出将是一个CSV,它将被泵回到性能测试的第2阶段,使用配对的激活码激活用户帐户.

如果我的记录符号具有误导性,我会道歉,我已相应地更新了它们.

感谢您的回复,我将尝试两个想法:

  • 首先排序列表(我不知道这是多么昂贵)
  • 使用transactionCodes作为键创建字典,然后将用户和激活代码存储在列表中作为值

性能对我来说并不是最重要的,我只想尝试用Python编程养成良好的习惯.

S.L*_*ott 6

这是一个激进的方法.

别.

你有两个CSV文件; 一个(用户)显然是驱动程序.别这一点.另一个 - 用户的交易代码 - 可以变成一个简单的字典.

除非绝对必要,否则不要"合并"或"加入"任何东西.当然不要"合并"或"预先加入".

编写应用程序只需在其他集合中进行简单查找即可.

创建一个字典列表并迭代列表,每次比较密钥,

关.看起来像这样.注意:没有排序.

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 )
Run Code Online (Sandbox Code Playgroud)

这很快速而且简单.保存词典(使用shelvepickle).

然而,最糟糕的情况是这可能会运行到len(inputDict)*len(outputDict)< - 不确定?

假.

一个列表是"驾驶"列表.另一个是查找列表.您将通过迭代用户并查找适当的事务值来开车.这是用户列表中的O(n).查找是O(1),因为字典是哈希.