列表中的Python查找搜索:多个搜索条件,需要返回值

时间:2013-11-06 16:59:16

标签: python csv

我有一个相对较大的csv文件,其中包含公司,产品和价格列表。不保证数据的排序(即未排序):

csv#1 (big file)        
... 
CompanyA     productB     0
CompanyA     productA     0
CompanyA     productC     0
CompanyB     productA     0
CompanyB     productB     0
CompanyB     productC     0
...     

“csv#1”中的某些条目包含错误数据(零)。我有第二个csv只包含来自csv#1的名称,这些名称包含错误的数据(及其更正的数据)。这个csv的顺序是降价:

csv#2 (small file - subset of csv#1)        
CompanyA     productC     15
CompanyA     productB     10
CompanyA     productA     5
CompanyB     productA     3
CompanyB     productB     2
CompanyB     productC     1

我想迭代csv#1,如果公司+产品的组合在csv#2中,则用csv#2价格覆盖。

我知道我可以通过强力执行此操作,对csv#1中的每一行迭代csv#2。我甚至可以通过将csv#2加载到一个数组中并在找到它们后删除它们来优化(每个组合在csv#1中只显示一次)。但我确信必须有更好的方法。

我发现一些引用表明sets是一种更有效的方式来进行这些查找搜索:

Most efficient way for a lookup/search in a huge list (python)

Fastest way to search a list in python

但我不确定如何将sets应用于我的示例。在给定多个搜索列的情况下,如何在此构造set,如果匹配则需要返回值?或者是否有比sets更好的方法?

2 个答案:

答案 0 :(得分:1)

我建议将csv#2加载到字典中,该字典实际上是一个哈希表,查询很快

Set也是没有值的哈希表,但这里有值

dict的键是(companyName,productName)的元组,值是价格

然后迭代csv#1并检查更正dict是否具有该公司名称的密钥(使用has_key,或者简单获取try中的密钥...除了块)如果有,则使用相关价格进行修复值

答案 1 :(得分:1)

由于技术上可以将键与值相关联,为什么不使用字典呢?对于列表,它具有恒定的查找时间O(1)而不是O(N)。除了键值对的概念之外,它类似于一组。

csv1_dict = {  ...,
            "CompanyA productA" : 0,
            "CompanyA productB" : 0,
            ...
            }

csv2_dict = { ...,
            "CompanyA productA" : 10,
              ...
            }
for key,value in csv2_dict.iteritems():
    try:
        csv1_dict[key] = csv2_dict[key]
    except:
        #Key not in csv1

如果您可以保证csv2中的公司产品位于csv1中,请随时删除try块。