【问题标题】:multiple conditional boolean logic Python多个条件布尔逻辑 Python
【发布时间】:2021-07-07 23:43:57
【问题描述】:

我能否获得有关 Python 中布尔条件逻辑的更好方法的提示?我正在尝试根据current_time 介于starttimeendtime 之间以及其他布尔逻辑返回True 或False,以检查日期时间工作日编号的current_day 是周末还是工作日。

一个函数似乎最适合这个吗?任何提示都可以帮助我遇到一个问题,如果 WeekendsWeekdays 都是 False,这意味着该事件被禁用,或者如果 current_time 不在 starttimeendtime 之间,该事件也将被禁用,所以Return False

from datetime import datetime

now = datetime.now()
current_time = now.strftime("%H:%M")
print("Current Time is ", current_time)

# To Get the Week Number
current_day = datetime.today().weekday()
print("Current Weekday Number is ", current_day)   


data1 = {'setpoint': '366', 'Weekdays': 'True', 'Weekends': 'True', 'starttime': '02:40', 'endtime': '22:40'}
data2 = {'setpoint': '366', 'Weekdays': 'False', 'Weekends': 'True', 'starttime': '02:40', 'endtime': '22:40'}
data3 = {'setpoint': '366', 'Weekdays': 'True', 'Weekends': 'False', 'starttime': '02:40', 'endtime': '03:40'}
data4 = {'setpoint': '366', 'Weekdays': 'False', 'Weekends': 'False', 'starttime': '02:40', 'endtime': '22:40'}



def condition_checker(data,current_time,current_day):
    between_time = data['starttime'] <= current_time <= data['endtime']
    #print("between_time", between_time)

    disabled = data['Weekends'] == False and data['Weekdays'] == False
    print("disabled is", disabled)
    
    weekday_rules = current_day in [0,1,2,3,4]
    #print("weekday_rules", weekday_rules)

    weekend_rules = current_day in [5,6]
    #print("weekend_rules", weekend_rules)
    
    if between_time and not disabled and weekday_rules or between_time and not disabled and weekend_rules:
        return True
    else:
        return False

data1 似乎可以正常工作:

# True weekend/weekdays and on start/end times 
condition_checker(data1,current_time,current_day)

返回

disabled is False
True

data2 似乎可以正常工作:

# True on Weekends and start/end times
condition_checker(data2,current_time,current_day)

返回

disabled is False
True

data3 似乎可以正常工作:

# False on times
condition_checker(data3,current_time,current_day)

返回

disabled is False
False

这是我的逻辑不起作用的地方,在disabled 上应该是错误的 data4 不工作

# False on disabled
condition_checker(data4,current_time,current_day)

返回

disabled is False
True

【问题讨论】:

  • 我很难理解您真正想要什么。你能澄清一下weekday_rulesweekend_rules 应该做什么吗?
  • 请注意,您的 if ... 条件似乎缺少括号。你的意思是(between_time and not disabled and weekday_rules) or (between_time and not disabled and weekend_rules)?如果是这样,(而 AFAIU weekday_rules 只是 not weekend_rules),这将归结为 if (between_time and not disabled): return True; else: return Falsereturn between_time and not disabled
  • 您的字典有“True”和“False”作为字符串。您的disabled 语句将这些与布尔值TrueFalse 进行比较。
  • @PranavHosangadi 我只是想验证当前的工作日数字是周末还是工作日,以及字典键是否也是 True。如果它们是 False,则返回 False
  • @not_speshal 有没有更好的方法来做到这一点?我意识到它的弦

标签: python


【解决方案1】:

您正在将字符串与函数中的布尔值进行比较。我会更改字典以保存布尔值True/False,如下所示:

data1 = {'setpoint': '366', 'Weekdays': True, 'Weekends': True, 'starttime': '02:40', 'endtime': '22:40'}
data2 = {'setpoint': '366', 'Weekdays': False, 'Weekends': True, 'starttime': '02:40', 'endtime': '22:40'}
data3 = {'setpoint': '366', 'Weekdays': True, 'Weekends': False, 'starttime': '02:40', 'endtime': '03:40'}
data4 = {'setpoint': '366', 'Weekdays': False, 'Weekends': False, 'starttime': '02:40', 'endtime': '22:40'}

或者(不太可取,但也可以),您可以更改函数以检查 string 值:

def condition_checker(data,current_time,current_day):
    between_time = data['starttime'] <= current_time <= data['endtime']
    disabled = data['Weekends'] == "False" and data['Weekdays'] == "False"
    print("disabled is", disabled)
    
    weekday_rules = current_day in [0,1,2,3,4]
    weekend_rules = current_day in [5,6]
    
    if between_time and not disabled and weekday_rules or between_time and not disabled and weekend_rules:
        return True
    else:
        return False

【讨论】:

  • 你有没有机会给我一个关于如何做到这一点的提示?仍然在这里学习很多...stackoverflow.com/questions/68289246/sqlite-boolean-operators
  • 怎么办?复制粘贴我在答案中的字典并使用您的原始功能。请注意 TrueFalse 值如何不在引号中。
  • 数据来自HTML表单输入表
  • 在这种情况下,最好更改您的函数以与=="True" 进行比较。我宁愿不更改输入数据。
  • 好的,感谢您的帮助,保留为字符串比较......
猜你喜欢
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2018-08-10
相关资源
最近更新 更多