Python中是否有一种语言可以用来实现逻辑数据切割?

Python中是否有一种语言可以用来实现逻辑数据切割?,python,logic,Python,Logic,假设我有以下形式的数据: variable1 = [23, 20, 13, 24, 25, 28, 26, 17, 18, 29] variable2 = [37, 46, 41, 40, 40, 39, 43, 42, 45, 56] variable3 = [101, 120, 110, 140] 现在让我们假设我想应用一些数据切割。也许我可以有一个削减的要求,比如: data = DataClass(variables = [variable1, variable2, variable3

假设我有以下形式的数据:

variable1 = [23, 20, 13, 24, 25, 28, 26, 17, 18, 29]
variable2 = [37, 46, 41, 40, 40, 39, 43, 42, 45, 56]
variable3 = [101, 120, 110, 140]
现在让我们假设我想应用一些数据切割。也许我可以有一个削减的要求,比如:

data = DataClass(variables = [variable1, variable2, variable3])
data.applyCut(cut = "variable1 >=20; 40 <= variable2 <= 45")
data.applyCut(cut = "if no variable1 then variable3 > 115")
data.print()
>>> variable1 = [23, 20, 13, 24, 25, 28, 26, 17, 18, 29]
>>> variable2 = [37, 46, 41, 40, 40, 39, 43, 42, 45, 56]
>>> variable3 = [101, 120, 110, 140]
>>> variable1 = [value for value in variable1 if value >= 20]
>>> variable2 = [value for value in variable2 if (value >= 40) and (value <=45)]
>>> print(variable1)
[23, 20, 24, 25, 28, 26, 29]
>>> print(variable2)
[41, 40, 40, 43, 42, 45]
>>> if not variable1:
...     variable3 = [value for value in variable3 if value > 115]
... else:
...     variable3 = [value for value in variable3]
... 
>>> print(variable3)
[101, 120, 110, 140]
  • 我要求
    variable1
    的所有值都大于或等于20
  • 我要求
    variable2
    的所有值大于或等于40,小于或等于45
  • 如果
    variable1
    的某些值已通过切割,则
    variable3
    未应用切割
  • 如果
    variable1
    的某些值未通过切割,则我要求
    variable3
    的所有值都大于115
在Python中是否有一些语言可以用来简洁地描述这些逻辑数据切割,然后应用这些逻辑数据切割?我可以设想如下情况:

data = DataClass(variables = [variable1, variable2, variable3])
data.applyCut(cut = "variable1 >=20; 40 <= variable2 <= 45")
data.applyCut(cut = "if no variable1 then variable3 > 115")
data.print()
>>> variable1 = [23, 20, 13, 24, 25, 28, 26, 17, 18, 29]
>>> variable2 = [37, 46, 41, 40, 40, 39, 43, 42, 45, 56]
>>> variable3 = [101, 120, 110, 140]
>>> variable1 = [value for value in variable1 if value >= 20]
>>> variable2 = [value for value in variable2 if (value >= 40) and (value <=45)]
>>> print(variable1)
[23, 20, 24, 25, 28, 26, 29]
>>> print(variable2)
[41, 40, 40, 43, 42, 45]
>>> if not variable1:
...     variable3 = [value for value in variable3 if value > 115]
... else:
...     variable3 = [value for value in variable3]
... 
>>> print(variable3)
[101, 120, 110, 140]
data=DataClass(变量=[variable1,variable2,variable3])

data.applyCut(cut=“variable1>=20;40我认为numpy可能是您想要的:

import numpy as np
v1 = np.array([23, 20, 13, 24, 25, 28, 26, 17, 18, 29])
v2 = np.array([37, 46, 41, 40, 40, 39, 43, 42, 45, 56])
v3 = np.array([101, 120, 110, 140])

def myfilter(v1, v2, v3): # how I would parse your "DataClass" code
    valid_ixs = (v1 >= 20) & (v2 >= 40) & (v2 <= 45)
    if any(valid_ixs): # could also use valid_ixs.sum()
        return v3[v3 > 115]
    return v3
print(myfilter(v1, v2, v3))

# what you're doing in python
v1 = v1[v1 >= 20]
v2 = v2[(v2 >= 40) & (v2 <= 45)]
v3 = v3[v3 > 115] if v1 else v3
将numpy导入为np
v1=np.数组([23,20,13,24,25,28,26,17,18,29])
v2=np.数组([37,46,41,40,40,39,43,42,45,56])
v3=np.数组([101120110140])
def myfilter(v1、v2、v3):#我将如何解析您的“数据类”代码
有效的ixs=(v1>=20)和(v2>=40)和(v2 115]
返回v3
打印(myfilter(v1、v2、v3))
#你在python中做什么
v1=v1[v1>=20]
v2=v2[(v2>=40)和(v2 115]如果v1或v3

请注意,在python中,
5您提供的列表理解如何不能满足您的需要?为此,您可以考虑更适合DSL编写的语言,例如Haskell或Scala。如果
variable1
numpy.ndarray
variable1[variable1>=20]
将为您提供
数组([23,20,24,25,28,26,29])
。我同意@FredLarson的观点。现在,如果你要处理数字数据,你可能想使用NumPy!NumPy,甚至熊猫(它们的行为几乎可以像熊猫一样),这太好了。非常感谢你的建议。这三条关键的行是如此的简短。这对我来说太棒了!