编写一个名为filter_out()的函数,该函数以整数列表作为输入,并返回只保留数字过滤后的列表



编写一个名为filter_out((的函数,该函数以一个整数列表为输入,并返回通过只保留5或7的倍数而不是同时保留这两个倍数来过滤的列表,例如,list=[5,7,35,49]返回[5],7,49]。

我的问题是我不能去掉这个数字,这两个数字都是5和7的倍数。

def filter_out(my_list):
a_list = []
for number in my_list:
if number % 5 == 0 or number % 7 == 0:
a_list.append(number)
return a_list
print(filter_out([1, 2, 3, 5]))
[5]
print(filter_out([5, 7, 35, 49]))
[5, 7, 49]

您可以检查数字是否不能除以35。

if (number % 5 == 0 or number % 7 == 0) and number % 35 != 0:
a_list.append(number)

您必须添加一个检查条件:

def filter_out(my_list):
a_list = []
for number in my_list:
if (number % 5 == 0 or number % 7 == 0) and number % 35 != 0:
a_list.append(number)
return a_list

我检查了35的除法,因为这当然是5*7的

解决方案

您可以使用以下函数来使用numpy和对列表进行矢量化

  1. 评估mod(list_array, 5)mod(list_array, 7)
  2. drop=在list_array中查找上一步中为零的值的交集
  3. keep=所有值-来自第2步的值(这就是您想要的(

最终实现是一个单行函数调用,如下所示。

# call function to get list of numbers to keep and to drop
keep, drop = process_to_keep(list_of_values, n=5, m=7)

带示例和输出的代码

import numpy as np
# dummy data
l = [5, 7, 35, 49]
# function to process data
def process_to_keep(list_of_values, n=5, m=7):
a = np.array(list_of_values)
A = a%n
B = a%m
drop = set(a[A==0]).intersection(set(a[B==0]))
keep = set(a) - drop
return list(sorted(keep)), list(sorted(drop))
# call function to get list of numbers to keep and to drop
keep, drop = process_to_keep(l, n=5, m=7)
print(' keep: {}n drop: {}'.format(keep, drop))

输出

keep: [49, 5, 7]
drop: [35]

另一个例子

函数是泛型函数。因此,我们可以用另一个列表来测试它:[5,7,30,35,42,49,50,70,100,105]

keep, drop = process_to_keep([5,7,30,35,42,49,50,70,100,105], n=5, m=7)
print(' keep: {}n drop: {}'.format(keep, drop))

输出

keep: [5, 7, 30, 42, 49, 50, 100]
drop: [35, 70, 105]

再举一个例子

假设您想检查一个数字列表是否可以单独被10或7整除,但不能同时被两者整除。同样的功能也会处理这个问题。

keep, drop = process_to_keep([5,7,30,35,42,49,50,70,100,105], n=10, m=7)
print(' keep: {}n drop: {}'.format(keep, drop))

输出

keep: [5, 7, 30, 35, 42, 49, 50, 100, 105]
drop: [70]

最新更新