Python 3.x 有没有更好的办法用字典来解决这个问题?

Python 3.x 有没有更好的办法用字典来解决这个问题?,python-3.x,pandas,dictionary,data-structures,Python 3.x,Pandas,Dictionary,Data Structures,我正在尝试解决以下问题: 示例csv数据集如下所示(数据集中共有1000行): 我试图解决的问题是: 机具和条件,例如钢制键盘应仅与包含钢制和键盘的项目名称匹配(不匹配 (必须按该顺序) 机具或条件,例如钢键盘应与项目名称钢表和木键盘匹配,因为它们各自包含 我们的搜索词之一 执行数字范围查询,例如价格在40美元到70美元之间的钢键盘 我已经使用以下方法解决了问题,但我觉得使用字典会使问题变得更简单: class SimpleSearch: def __init__(se

我正在尝试解决以下问题:

示例csv数据集如下所示(数据集中共有1000行):

我试图解决的问题是:

  • 机具和条件,例如
    钢制键盘
    应仅与包含
    钢制
    键盘
    的项目名称匹配(不匹配 (必须按该顺序)
  • 机具或条件,例如
    钢键盘
    应与项目名称
    钢表
    木键盘
    匹配,因为它们各自包含 我们的搜索词之一
  • 执行数字范围查询,例如价格在40美元到70美元之间的
    钢键盘
我已经使用以下方法解决了问题,但我觉得使用字典会使问题变得更简单:

class SimpleSearch: 
    
    def __init__(self,path):
        self.df = pd.read_csv(path)
    
        
    def match_keyword(self, pattern):
        self.df['matches'] = self.df['name'].str.findall(pattern).apply(lambda x: list(set(x)))
        
        
        ids = []
        for i in self.df.itertuples():
            if i.matches != []: 
                 ids.append(i.id)
                    
        return ids
    
if __name__ == '__main__': 
    path = "random_path/file.csv"
    pattern = "steel keyboard"
    search_obj = SimpleSearch(path)
    print(search_obj.match_keyword(pattern))
  • 是否有一种简单的方法可以使用字典区分
    以及
    操作的逻辑?我的解决方案只解决了这一点
  • 解决数值范围查询的最佳方法是什么?我想不出一个方法,可以提供一些帮助

在下面的数据框中,有3个结果匹配名称(1xAND,2xOR)和价格标准([40,70])

与熊猫解决问题 TL;DR

import re

search = "steel keyboard"
search = fr"({'|'.join(search.split())})"  # '(steel|keyboard)'
min_price = 40
max_price = 70

name_result = df["name"].str.findall(search, re.IGNORECASE).apply(len)
price_result = df["price"].between(min_price, max_price)

out = df.loc[(name_result > 0) & (price_result == True)]
名称标准

同时做这两件事是可能的

import re
search = "steel keyboard"
search = fr"({'|'.join(search.split())})"

name_result = df["name"].str.findall(search, re.IGNORECASE).apply(len)
结果 同时应用所有规则:

out = df.loc[(name_result > 0) & (price_result == True)]
dict求解

回答得很好。有没有办法用字典来解决这个问题?
import re
search = "steel keyboard"
search = fr"({'|'.join(search.split())})"

name_result = df["name"].str.findall(search, re.IGNORECASE).apply(len)
>>> pd.concat([df["name"], name_result], axis="columns")
                       name  name
0   Lightweight Linen Watch     0  # no match
1               Steel Table     1  # partial match (ANY of words <- OR)
2  Keyboard With Steel Keys     2  # full match (ALL words <- AND)
3           Wooden Keyboard     1
4         Small Rubber Lamp     0
5       Durable Leather Car     0
6            Steel Keyboard     2
7   Fantastic Granite Bench     0
8            Apple Keyboard     1
min_price = 40
max_price = 70

price_result = df["price"].between(min_price, max_price)
out = df.loc[(name_result > 0) & (price_result == True)]
>>> out
                       name  price
1               Steel Table  63.88
2  Keyboard With Steel Keys  48.24
6            Steel Keyboard  59.45
import re

search = "steel keyboard"
search = fr"({'|'.join(search.split())})"  # '(steel|keyboard)'
search = re.compile(search, re.IGNORECASE)
min_price = 40
max_price = 70

data = df.set_index("name").squeeze().to_dict()

out = {name: price for name, price in data.items()
           if search.search(name) and min_price <= price <= max_price}
>>> out
{'Steel Table': 63.88,
 'Keyboard With Steel Keys': 48.24,
 'Steel Keyboard': 59.45}