Python代码-在尝试查找子集时,如何更改范围内数组的每个元素



我想检查一个数组(exp1exp2exp3,..(是否是另一个数组sim的子集,但元素的差异可以在(+-2(范围内。以下是的示例

sim = [205.46,195.93,189.6,184.01,179.23,158.31,149.07,129.27,110.87,94.524,81.518,49.244,43.926,28.643]
exp1 = [190.61, 109.5, 42.323 ] # This is a subset
exp2 = [205, 28.6]              # This is a subset
exp3 = [88]                     # This is NOT a subset
exp4=[208.14, 125.162, 186.2]   # This is NOT a subset

我发现这个代码可以很容易地找到子集,但我不知道如何包括+2和-2之间的范围。

# Return 1 if arr2[] is a subset of
# arr1[]
def isSubset(arr1, arr2, m, n):
i = 0
j = 0
for i in range(n):
for j in range(m):
if(arr2[i] == arr1[j]):
break

# If the above inner loop was
# not broken at all then arr2[i]
# is not present in arr1[]
if (j == m):
return 0
# If we reach here then all
# elements of arr2[] are present
# in arr1[]
return 1
# Driver code
if __name__ == "__main__":
arr1 = [11, 1, 13, 21, 3, 7]
arr2 = [11, 3, 7, 1]
m = len(arr1)
n = len(arr2)
if(isSubset(arr1, arr2, m, n)):
print("arr2[] is subset of arr1[] ")
else:
print("arr2[] is not a subset of arr1[]")

在我找到一种方法之后,我会在sim数组上循环,比如sim1、sim2。。。在这里,我试图将一组模拟结果与一组实验结果进行比较,其中误差条在+-2以内。我感谢你的帮助。

我想你只需要在isSubset函数的条件语句中添加这个比较句:

if (arr2[i] >= arr1[j]-2 and arr2[i] <= arr1[j]+2):
break

此外,您还可以提高流程效率:

for i in range(n):
for j in range (m):
if (arr2[i] >= arr1[j]-2 and arr2[i] <= arr1[j]+2):
break
if j == m-1:
return 0

在python中,for循环不需要任何声明,因为默认情况下python只是从0循环到m-1。

数据集有多大?如果它不太大,你可以通过一个很酷的修改来解决它——你可以从原始数据创建一个范围列表,而不是查看值列表。

sim = [205.46, 195.93, 189.6, 184.01, 179.23, 158.31, 149.07, 129.27, 110.87, 94.524, 81.518, 49.244, 43.926, 28.643]
exp1 = [190.61, 109.5, 42.323]
exp4 = [208.14, 125.162, 186.2]
sim_range = [(x - 2, x + 2) for x in sim]
def check_if_in_range(exp):
for num in exp:
if not any(r[0] <= num <= r[1] for r in sim_range):
return False
return True

print(check_if_in_range(exp1))
print(check_if_in_range(exp4))

输出为:

True
False

您需要稍微更改函数isSubset()

# Return True if arr2[] is a subset of arr1[], with specified error
def isSubset(arr1, arr2, error):
for a2 in arr2:
found = False
for a1 in arr1:
if(abs(a1 - a2) < error):
found = True
break
if not found:
return False
return True

我没有比较索引,而是在数组上迭代in,并保存了一个变量,检查是否在指定的error边界中找到了解决方案——例如2

# Driver code
if __name__ == "__main__":
sim = [205.46,195.93,189.6,184.01,179.23,158.31,149.07,129.27,110.87,94.524,81.518,49.244,43.926,28.643]
exp1 = [190.61, 109.5, 42.323 ] # This is a subset
exp2 = [205, 28.6]              # This is a subset
exp3 = [88]                     # This is NOT a subset
exp4 = [208.14, 125.162, 186.2] # This is NOT a subset
print(isSubset(sim, exp1, 2)) # True
print(isSubset(sim, exp2, 2)) # True
print(isSubset(sim, exp3, 2)) # False
print(isSubset(sim, exp4, 2)) # False

谢谢大家。问题是(j==m(,我把它改为(j==m-1(。我还用(abs(arr2[I]-arr1[j](<2( 这是一个完美的代码:

# Python 3 program to find whether an array 
# is subset of another array 
# Return 1 if arr2[] is a subset of  
# arr1[]  
def isSubset(arr1, arr2, m, n):
i = 0
j = 0
for i in range(n):
for j in range(m):
if(abs(arr2[i] - arr1[j])<=2):
break
# If the above inner loop was 
# not broken at all then arr2[i] 
# is not present in arr1[]  
if j == m-1:
return 0
# If we reach here then all 
# elements of arr2[] are present 
# in arr1[]  
return 1
# Driver code 
if __name__ == "__main__":
arr1 = [11, 1, 13, 21, 3, 7]
#    arr2 = [7, 11, 1, 13] 
arr2 = [2,9]
m = len(arr1)
n = len(arr2)
if(isSubset(arr1, arr2, m, n)):
print("arr2[] is  subset of arr1[] ")
else:
print("arr2[] is not a subset of arr1[]")

最新更新