Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于另一个数据集筛选数据集_Python_Algorithm_Performance_Filtering - Fatal编程技术网

Python 基于另一个数据集筛选数据集

Python 基于另一个数据集筛选数据集,python,algorithm,performance,filtering,Python,Algorithm,Performance,Filtering,我有很多用户,他们有自己喜欢的颜色。我有一个数据集——每个记录都有颜色数据——我想给每个用户发送一封电子邮件。在每封电子邮件中,用户将看到基于他/她最喜欢的颜色过滤的数据,这意味着我需要根据他们最喜欢的颜色过滤此数据集 比如,;用户最喜欢的颜色如下: [User1:“绿色”、“黄色”,User2:“绿色、蓝色”,User3:“红色”,User4:“橙色”、“紫色”、“红色”,User5:“蓝色”、“黄色”…] 如何根据用户喜爱的颜色有效过滤此数据集 最直接的方法是循环浏览用户列表,并在每次迭代中

我有很多用户,他们有自己喜欢的颜色。我有一个数据集——每个记录都有颜色数据——我想给每个用户发送一封电子邮件。在每封电子邮件中,用户将看到基于他/她最喜欢的颜色过滤的数据,这意味着我需要根据他们最喜欢的颜色过滤此数据集

比如,;用户最喜欢的颜色如下: [User1:“绿色”、“黄色”,User2:“绿色、蓝色”,User3:“红色”,User4:“橙色”、“紫色”、“红色”,User5:“蓝色”、“黄色”…]

如何根据用户喜爱的颜色有效过滤此数据集

最直接的方法是循环浏览用户列表,并在每次迭代中按当前用户最喜欢的颜色过滤数据集。但是,这可能会导致对相同或常见颜色的冗余查询。因此,如果我有100万用户,那么我将对同一数据集进行100万次查询


有人能提出一个让这个过程更优雅的想法吗?我将使用Python来实现这一点,但答案可以是独立于语言的

由于这完全是理论性的,您不提供您希望使用的技术,因此我将通过一个查询进行过滤,该查询将检索具有相同匹配选项颜色的用户。现在,如果您使用的是.NET,则可以通过SQL查询或LINQ to SQL来实现这一点。如果你能提供更多关于你将使用哪种语言的信息,我可以给你更具体的答案。

如果你能提供更多关于你使用的语言和工具/技术的详细信息,那会更好

问题是否仅存在于现有数据集的筛选中?或者我可以修改代码吗?我有一个想法,如果我可以添加一些代码

例如,我想象我如何解决这个问题,而不使用任何纯JavaScript工具。在本例中,我更喜欢使用上面提供的两个表User->Color和Color->User以及它们之间的关系,并立即更新这两个表。检查代码片段以了解我的意思

键值数据库将是一个很好的选择

我帮不了你更多,因为这个问题不包含任何技术信息,但我只是把我的答案留在这里。也许这会让你产生任何想法:

var USERS={DefaultUser:{TestColor:true}}; var COLORS={TestColor:{DefaultUser:true}}; 函数addColor用户标识,颜色{ 如果!COLORS[color]COLORS[color]={}; COLORS[color][userId]=true; 如果!USERS[userId]USERS[userId]={}; 用户[userId][color]=true; } 函数removeColor用户标识,颜色{ 如果!颜色[颜色]返回; 删除颜色[color][userId]; 如果!USERS[userId]USERS[userId]={}; 删除用户[userId][color]; } 函数findUserByColor{ 返回Object.keysCOLORS[color]|{}; } 函数addColorsToUsers{ addColor'User1','Green'; addColor'User1','Yellow'; addColor'User2','Green'; addColor'User2','Blue'; addColor'User3','Red'; addColor'User4'、'Orange'; addColor'User4','Purple'; addColor'User4','Red'; addColor'User5','Blue'; addColor'User5','Yellow'; } 函数运行作业{ console.log'Result:findUsersByColorGreen',findUsersByColorGreen 去除色素1,绿色 console.log'Result:findUsersByColorGreen',findUsersByColorGreen } 添加用户;
runJob 在@jake2389思想的基础上,你可以做一些技巧。您真正能做什么在很大程度上取决于您的数据集有多大,以及您能将其放入内存或数据库中多少次。提高性能的明显方法是进行一些缓存。假设您有一个方法getRecordsForColorscolors,它对数据库进行真正的过滤或真正的查询。一些非常幼稚的方法是这样的:我没有尝试这段代码,所以可能会有很多小错误:

cache = dict()

def getRecordsCached(colors):
    global cache
    if colors not in cache:
       records = getRecordsForColors(colors)
       cache[colors] = records
       return records
    else:
       return cache[colors]
这种方法的明显缺点是,即使只有一个用户使用颜色组合,也必须在缓存中保存所有颜色组合,这可能会非常多

更聪明的方法可能是选择一些阈值,例如3种颜色,您可以存储所有组合:

cache = dict()

def getRecordsCached(colors):
    global cache
    if colors not in cache:
       records = getRecordsForColors(colors)
       if len(colors) < threshold:
          cache[colors] = records
       return records
    else:
       return cache[colors]
这将覆盖大多数用户,那些具有罕见长组合的用户将产生一些重复查询

显然,您根本不必使用简单的基于dict的缓存或内存缓存。您可以将数据缓存在同一个数据库中,也可以使用一些专门的缓存数据库,如Memcached或Redis。也可以使用一些支持LRU缓存的专用缓存库,而不是颜色长度形式的阈值


最后,如果您的逻辑是给定颜色集的结果只是每种颜色结果的并集,那么您可以尝试通过单独缓存每种颜色的结果来覆盖客户端上罕见的大颜色组合,如果颜色组合不直接缓存,通过合并每个颜色的缓存结果中的项来计算它。

如果用户拥有比颜色大得多的用户,则可以考虑为所有子集生成过滤器。
先发制人地说,你知道这将是2^n,其中n=可能的颜色,这取决于你有多少颜色,可能会大大少于100万用户。谢谢你的回答。它为我澄清了许多观点。