0

我有一个相对较大的 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是进行此类查找搜索的更有效方法:

在巨大列表中查找/搜索的最有效方法(python)

在python中搜索列表的最快方法

但我不确定如何应用于sets我的示例。set给定多个搜索列,并且如果存在匹配项需要返回一个值,我如何在此处构建一个?还是有比 更好的方法sets

4

2 回答 2

1

我建议将 csv#2 加载到实际上是哈希表的字典中,并且查询速度很快

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

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

然后遍历 csv#1 并检查更正字典是否具有该公司名称的键(使用 has_key,或简单地在 try ... 块中获取键),如果有,则使用关联的价格值进行修复

于 2013-11-06T17:12:49.973 回答
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 中的 Company 产品在 csv1 中,请随意删除 try 块。

于 2013-11-06T17:20:05.660 回答