Python使用三元组选择满足特定条件的产品



条件三元组是以(i,c,v(的方式设置的,其中i是索引的整数特征,c是关系符号,v是值的某个特征,例如获取水果清单使用特征"名称"、"颜色"、"重量"、"价格">

fruits =[['Apple','Red',1,20],
['orange','orange',2,10],
['pear','green',3,25],
cheap = (3,'<=',10)

我需要实现一个名为selection(产品、条件(的函数选择(水果,便宜(将在哪里回归['orange','orange',2,10]这个函数应该适用于任何给定的产品和任何给定的条件,只要它保持产品的"名称"、"颜色"、"重量"、"价格"的格式,并且对于条件,它保持(i,c,v(的格式,我不知道如何在没有硬编码的情况下开始,它应该在没有硬代码的情况下实现,我目前拥有的

x = len(conditions)
z = x - 1
i = 0
while i != x:
if conditions[i + 1] == '<':
if products[conditions[i]] < conditions[i + 2]:
n = True
checker.append(n)
else:
n = False
checker.append(n)
elif conditions[i + 1] == '<=':
if products[conditions[i]] <= conditions[i + 2]:
n = True
checker.append(n)
else:
n = False
checker.append(n)
elif conditions[i + 1] == '==':
if products[conditions[i]] == conditions[i + 2]:
n = True
checker.append(n)
else:
n = False
checker.append(n)
elif conditions[i + 1] == '>=':
if products[conditions[i]] >= conditions[i + 2]:
n = True
checker.append(n)
else:
n = False
checker.append(n)
elif conditions[i + 1] == '>':
if products[conditions[i]] > conditions[i + 2]:
n = True
checker.append(n)
else:
n = False
checker.append(n)
elif conditions[i + 1] == '!=':
if products[conditions[i]] != conditions[i + 2]:
n = True
checker.append(n)
else:
n = False
checker.append(n)
i = i + 3
if 'False' in checker:
pass
else:
return products

一种方法是使用eval()。我知道很多人出于安全原因不喜欢使用eval(),但在这种情况下,我不明白为什么不这样做。

此外,我会使用panda来处理这种数据结构。

In [1]: import pandas as pd
In [2]: fruits =[['Apple','Red',1,20],
...:          ['orange','orange',2,10],
...:          ['pear','green',3,25]]
In [3]: df = pd.DataFrame(fruits, columns=['name', 'color', 'x', 'y'])
In [4]: df
Out[4]:
name   color  x   y
0   Apple     Red  1  20
1  orange  orange  2  10
2    pear   green  3  25

现在,让我们使用eval创建一个函数。

In [5]: def f(df, x, op, y):
...:     return eval(f'df.loc[(df.x {op} {x}) & (df.y {op} {y})]')
...:
...:
In [6]: f(df, 3, '<=', 10)
Out[6]:
name   color  x   y
1  orange  orange  2  10

您可以使用eval让Python为您完成工作,也可以使用字典映射到各种条件运算符的lambda函数:

使用eval((:

def selection1(products,triple):
i,c,v = triple
condition = eval(f"lambda p: p[{i}] {c} v",{"v":v})
return next(filter(condition,products),None)

使用字典:

def selection2(products,triple):
i,c,v      = triple
conditions = { "<" : lambda p:p[i] <  v,
"<=": lambda p:p[i] <= v,
"==": lambda p:p[i] == v,
"!=": lambda p:p[i] != v,
">=": lambda p:p[i] >= v,
">" : lambda p:p[i] >= v
}
return next(filter(conditions[c],products),None)

最新更新