Функции возвращают неизменные значения. Это так, как это происходит в Swift. Если вы хотите, чтобы он был изменяемым, вы должны сначала сохранить его в var
.
Однако, вы можете использовать +
для объединения Array
с любым Sequence
. Поэтому, если filteredApps
является Array
, это должно сработать:
let filteredDataOpt: [TimeSeriesEntry?] = filteredApps
.map { data in
let isInDate = dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
}
return isInDate ? self.timeSeriesData(appData: data) : nil
} + self.locationsData.map { data in
let isInDate = dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
}
return isInDate ? self.timeSeriesData(locationData: data) : nil
}
let filteredData = filteredDataOpt.compactMap { [110] }
Есть несколько других вещей, которые мы можем сделать, чтобы очистить и этот код. Мы можем вычленить тест даты:
func isValid(_ candidate: Date) -> Bool {
return dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: candidate, toGranularity: Calendar.Component.day)
}
}
let filteredDataOpt: [TimeSeriesEntry?] = filteredApps
.map { data in
return isValid(data.date) ? self.timeSeriesData(appData: data) : nil
} + self.locationsData.map { data in
return isValid(data.date) ? self.timeSeriesData(locationData: data) : nil
}
let filteredData = filteredDataOpt.compactMap { [111] }
В зависимости от ваших данных, может быть лучше предварительно рассчитать допустимые диапазоны Date
:
let calendar = Calendar.current
let dayRanges: [Range<Date>] = dates.lazy.compactMap({ [112] }).map({ date in
let start = calendar.startOfDay(for: date)
let end = calendar.date(byAdding: .day, value: 1, to: start)!
return start ..< end
})
func isValid(_ candidate: Date) -> Bool {
return dayRanges.contains(where: { [112].contains(candidate) })
}
Мы также можем разделить фильтрация от трансформера. Это позволяет нам исключить использование compactMap
:
let filteredData = Array(filteredApps.lazy.filter({ isValid([113].date) }).map(self.timeSeriesData))
+ locationsData.lazy.filter({ isValid([113].date) }).map(self.timeSeriesData)
Или мы могли бы использовать compactMap
дважды:
let filteredData = filteredApps.compactMap({ isValid([114].date) ? self.timeSeriesData(appData: [114]) : nil })
+ locationsData.compactMap({ isValid([114].date) ? self.timeSeriesData(locationData: [114]) : nil })
raw_input
возвраты строка (последовательность символов). В Python, умножая строку и плавание не делает определенного значения (при умножении строки, и целое число имеет значение: "AB" * 3
"ABABAB"
; сколько "L" * 3.14
? Не отвечайте "LLL|"
). Необходимо проанализировать строку к численному значению.
Вы могли бы хотеть попробовать:
salesAmount = float(raw_input("Insert sale amount here\n"))
Проблема состоит в том, что salesAmount устанавливается на строку. Если Вы вводите переменную в интерпретатор Python и совершаете нападки, входят, Вы будете видеть значение, вводимое окруженный кавычками. Например, если бы Вы вошли 56.95, то Вы видели бы:
>>> sales_amount = raw_input("[Insert sale amount]: ")
[Insert sale amount]: 56.95
>>> sales_amount
'56.95'
Вы захотите преобразовать строку в плавание прежде, чем умножить его на налог с продаж. Я оставлю это, чтобы Вы выяснили.Удачи!