1

我有这个代码:

def time24hr(tstr):

    if ('a' and ':') in tstr:
        if tstr[:2] == '12':
            tstr = tstr.replace('12', '00').replace(':','').replace('am','hr')
            return tstr

        elif len(tstr[:tstr.find(':')]) < 2:
        # If length of string's 'tstr' slice (that ends before string ':') is less than 2
            tstr = tstr.replace(tstr[:tstr.find(':')],'0' + tstr[:tstr.find(':')]).replace(':', '').replace('am','hr')
            # Replace one-character string with combination of '0' and this one-character string. Then remove colon, by replacing it with lack of characters and replace 'am' string with 'hr'.
            return tstr

        else:
            tstr = tstr.replace(':', '').replace('am', 'hr')
            return tstr

    elif ('p' and ':') in tstr:
        tstr = tstr.replace(':', '').replace('pm', 'hr')
        return tstr

    else:
        return "Time format unknown. Type correct time."

当我执行此代码时,它应该print time24hr('12:34am')返回0034hr字符串。它也适用于此print time24hr('2:59am'),返回0259hr。但是当我在其中键入 string 时12,它会自动省略这部分代码if ('a' and ':') in tstr:或 thiselif ('p' and ':') in tstr:并继续执行此部分:

if tstr[:2] == '12':
    tstr = tstr.replace('12', '00').replace(':','').replace('am','hr')
    return tstr

因此,无论我输入12:15amor 12:15pm,此代码如果找到12in 字符串,就会开始执行上述代码。print time24hr('12:15pm')返回0015pm但应该返回0015hr,并且只针对其中包含的字符串am。否则,不要更改1200并返回 ie 1244hrfor 12:44pm

if ('a' and ':') in tstr:我的问题是,为什么那些逻辑检查elif ('p' and ':') in tstr:不起作用?此代码旨在成为此测验的解决方案-> http://www.pyschools.com/quiz/view_question/s3-q8

==================================================== =================================

感谢您帮助我进行逻辑运算。

另外,我已经完成了上面提到的测验,这是工作代码:

def time24hr(tstr):

    if (len(tstr[:tstr.find(':')]) == 2) and (tstr[0] == '0'):
        tstr = tstr.replace(tstr[0], '')

    if ('a' in tstr) and (':' in tstr):
        if tstr[:2] == '12':
            tstr = tstr.replace('12', '00').replace(':', '').replace('am', 'hr')
            return tstr

        elif len(tstr[:tstr.find(':')]) < 2:
        # If length of string's 'tstr' slice (that ends before string ':') is less than 2
            tstr = tstr.replace(tstr[:tstr.find(':')], '0' + tstr[:tstr.find(':')]).replace(':', '').replace('am', 'hr')
            # Replace one-character string with combination of '0' and this one-character string. Then remove colon, by replacing it with lack of characters and replace 'am' string with 'hr'.
            return tstr

        else:
            tstr = tstr.replace(':', '').replace('am', 'hr')
            return tstr

    elif ('p' in tstr) and (':' in tstr):
        if tstr[:2] == '12':
            tstr = tstr.replace(':', '').replace('pm', 'hr')
            return tstr

        elif len(tstr[:tstr.find(':')]) < 2:
            PmDict = {'0':'12','1':'13', '2':'14', '3':'15', '4':'16', '5':'17', '6':'18', '7':'19', '8':'20', '9':'21', '10':'22', '11':'23'}
            tstr = tstr.replace(tstr[:tstr.find(':')], PmDict[tstr[:tstr.find(':')]]).replace(':', '').replace('pm', 'hr')
            # Replace every "number" (which is string literally) with it's corresponding "number" in 24HR format, found in 'PmDict' dictionary. Then, as in above cases, remove colon ':' by replacing it with lack of character or space and then replace 'pm' with 'hr'
            return tstr

    else:
        return "Time format unknown. Type correct time."

如您所见,我没有根据 KISS 规则编写此代码 - 因为它有点复杂,但在 IMO 中运行良好。

可以在这里测试-> http://doc.pyschools.com/console

为大家干杯,感谢您的帮助:)

4

4 回答 4

6
if ('a' and ':') in tstr:

if ':' in tstr:

希望这能让您深入了解问题似乎是什么。

可能替换为

if 'a' in tstr and ':' in tstr:
于 2012-08-17T14:16:41.827 回答
0

您可以使用以下方法概括此测试是否存在多个元素all

if all(ch in tstr for ch in 'a:'):
    etc...
于 2012-08-17T14:30:20.390 回答
0

您的主要问题是您的代码检查子字符串包含不正确:您使用in不当。当你写

if ('a' and ':') in tstr:

它首先评估('a' and ':')get:然后检查if ':' in tstr。这就是为什么第一个if块不断评估为真。发生这种情况是因为and它是一个布尔运算,并且x and y等价于x if bool(x) else y. 这个表达式在你进行in检查之前就被评估了。

您可以将该代码替换为

if ('a' in tstr) and (':' in tstr)

(并对其他检查进行类似的操作)

于 2012-08-17T14:20:10.873 回答
0

那么你的第一次检查:

('a' and ':') in tstr

只是真正检查 ':' 是否在 tstr 中。究竟为什么会这样,我不确定,但如果您('a' and ':')在交互式 Python 中运行该语句,您会看到它返回 ':'。

您的第二次检查有同样的错误。

考虑使用

if ':' in tstr and 'a' in tstr:

elif 'p' in tstr and ':' in tstr:

不幸的是,Python 只能这么像英语 :)

于 2012-08-17T14:17:05.053 回答