Python filter method using callback functionality

Viewed 369

I have this JavaScript method that filters entries in an array that are one day apart:

one_day_deltas = availableDates.filter((date, index, arr) => {
        return Math.abs(moment(date).diff(moment(arr[index - 1]), 'days')) == 1  || Math.abs(moment(date).diff(moment(arr[index + 1]), 'days')) == 1
})

I know there exists a Python function: filter() but I can't figure out how to mimic the build in args that JavaScript filter has built in callback argument.

1 Answers

Python's built-in filter method only passes through the given item for an iteration, but does not pass along the index or a reference to the array. I don't think Python has anything else built in that will work how the JS .filter() works, but you can very easily write one yourself, like so:

def myFilter(cb, array):
  results = []
  for index, item in enumerate(array):
    result = cb(item, index, array)
    # if returned true, append item to results
    if result:
      results.append(item)
  return results

myArr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

def filterVowelsCb(letter, index, arr):
  # Show that each iteration gets the item, index, and reference to the array
  print("letter: " + letter, "index: " + str(index), "arr: " + str(arr))
  vowels = ['a', 'e', 'i', 'o', 'u']
  # Need to return a true/false value just like in JS
  return letter in vowels

vowels = myFilter(filterVowelsCb, myArr)
print(vowels)
Related