我有一个相对较大的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
更好的方法?
答案 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块。