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

列表中的Python查找搜索:多个搜索条件,需要返回值,python,csv,Python,Csv,我有一个相对较大的csv文件,其中包含公司、产品和价格的列表。不保证数据的顺序(即未排序): “csv#1”中的某些条目包含错误数据(零)。我有第二个csv,其中只包含csv#1中有错误数据(及其更正数据)的名称。此csv的订购按降价进行: csv#2 (small file - subset of csv#1) CompanyA productC 15 CompanyA productB 10 CompanyA productA

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

“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中只显示一次)进行优化。但我相信一定有更好的办法

我发现一些参考资料表明,
集合
是进行此类查找搜索的更有效的方法:


但我不知道如何将
集合应用到我的示例中。考虑到多个搜索列,以及如果存在匹配项,则需要返回值,如何在此处构造
集合
?或者有比
集合
更好的方法吗?

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

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

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


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

,因为您可以从技术上将密钥与值关联,为什么不使用字典呢?它具有恒定的查找时间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块。

您的示例数据似乎已排序。在你的实际数据中是这样吗?@femtoRgon-如果我的简化数据有误导性的话,很抱歉。数据按降价排序,而不是按任何名称字段排序。我将修改这个问题,以便更清楚地说明这一点。我不认为公司名称会起关键作用,因为它们不是唯一的。我可以使用元组作为键(公司、产品)吗?或者我需要将company+product加入一个键字符串吗?是的,元组可以用作键。(仅供参考,列表不可用作键,因为列表不可散列)我更新了答案(抱歉,现在我意识到公司的价格没有意义,我没有注意到名称的含义,只是看到了逻辑!:D)我会迭代csv文件来构建词典吗?我是否将“CompanyA productA”作为一个字符串实际连接以生成密钥?我真的需要csv1的dict吗?如果我需要迭代它来构建dict,也许我可以使用该迭代来进行比较(一旦我有了csv2的dict)?不管怎样,你都必须迭代csv,所以是的,你可以将csv2作为dict加载,然后在迭代csv1时,只需插入一个try块并尝试将新值写入输出,然后在except中写入原始值。至于一个键,它可以是你想要的任何东西,只要它是唯一的。我认为dict查找需要O(lg(N))而不是O(1),因为它在散列代码上使用二进制搜索,比如将它列为O(N)最坏的情况,假设你有一些python实现,其中dict的散列算法不好,导致链接,但平均显示O(1)(这是一个好的散列函数应该具备的功能)。
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