【问题标题】:python getting the maximum date and maximum time from the input sequencepython从输入序列中获取最大日期和最长时间
【发布时间】:2018-08-10 05:59:44
【问题描述】:

当用户输入 10-12 个数字时,我想获取最大日期和最长时间,以空格或逗号分隔

我尝试了日期的代码,但我陷入了创建一个逻辑来获取日期的最大月份 我所做的是首先按降序对列表进行排序,然后检查结果列表,如果数字小于或等于 1,则将其放置在第 0 个索引上,然后如果第 0 个索引编号为 1,则第 1 个数字index 将小于或等于 2

digits = [int(x) for x in input("Enter the digits").split(",")]
date = []

print(digits)

for x in range(0, len(digits)):
    for y in range(0, len(digits) - x - 1):
        if digits[y] <= digits[y + 1]:
            temp = digits[y]
            digits[y] = digits[y + 1]
            digits[y + 1] = temp

print(digits)

for x in range(0, len(digits)):
    if digits[x] <= 1:
        date.insert(0, digits[x])
        break

digits.remove(digits[x])
print("digits ", digits)
print(date)

for y in range(0, len(digits) - 1):
    if date[0] == 1:
        while digits[y] >= 0 and digits[y] <= 2:
            if digits[y] >= digits[y + 1]:
                date.insert(1, digits[y])
                digits.remove(digits[y])
                break
    if date[0] < 1:
        while digits[y] >= 0 and digits[y] <= 9:
            if digits[y] >= digits[y + 1]:
                date.insert(1, digits[y])
                digits.remove(digits[y])
                break
    break
print("digits", digits)

for x in range(0, len(digits)):
    if digits[x] <= 3:
        date.insert(2, digits[x])
        break

digits.remove(digits[x])
print(date)

print("digits", digits)

for y in range(0, len(digits)):
    if date[2] == 3:
        while digits[y] >= 0 and digits[y] <= 1:
            if digits[y] >= digits[y + 1]:
                date.insert(3, digits[y])
                digits.remove(digits[y])
                break
    if date[2] < 3:
        while digits[y] >= 0 and digits[y] <= 9:
            if digits[y] >= digits[y + 1]:
                date.insert(3, digits[y])
                digits.remove(digits[y])
                break
    break

print(date)

当我给出输入时,现在在上面的代码中

input : 1,0,0,1,1
output :
[1, 0, 0, 1, 1]
[1, 1, 1, 0, 0]
digits  [1, 1, 0, 0]
[1]
digits [1, 0, 0]
[1, 1, 1]
digits [0, 0]
[1, 1, 1, 0]

所以这里 1,1,1,0 是 11 个月,10 是天 所以格式应该是 MMDD,包括零 但是当我提供其他输入时,例如

input : 1,2,3,1,1
output :
[1, 2, 3, 1, 1]
[3, 2, 1, 1, 1]
digits  [3, 2, 1, 1]
[1]
digits [3, 2, 1, 1]
[1, 3]
digits [2, 1, 1]
Traceback (most recent call last):
File "date.py", line 51, in <module>
    if date[2] == 3:
IndexError: list index out of range

这里我想要 1,2,3,1 作为月 12 和天 31

【问题讨论】:

  • 不太明白输入数字与日期的关系,您能详细说明一下吗?每个数字应该代表什么?
  • Digits 是用户输入的 i
  • 这从代码中可以理解,我不明白的是每个数字的含义。年?几个月?天?
  • 我将编辑输出类型
  • 我编辑了格式

标签: python-3.x date time


【解决方案1】:
import datetime, itertools

dates = []
try:
    digits = [int(x) if int(x) < 10 else 100 for x in input("Enter the digits").split(",")]
    if 100 in digits:
        raise ValueError('Must be digits and not numbers')
    date_perms = itertools.permutations(digits, 4)
    for date in date_perms:
        dates.append((date[0]*10+date[1], date[2]*10+date[3]))
except ValueError as e:
    print(e)

for i, date in enumerate(dates):
    try:
        dates[i] = datetime.datetime(year=1, month=date[0], day=date[1])
    except ValueError as e:
        dates[i] = datetime.datetime(1,1,1,1)
if len(dates) > 0:
    maximum = max(dates)
    if maximum.hour == 1:
        print('None of the combinations created a valid date')
    else:
        print('Month:', maximum.month, 'Day:', maximum.day)

我认为这可能会满足您的需求。 itertools.permutations 创建给定数字的所有可能组合。
第二个 try-except 块将用Year=1, month=1, day=1, hour=1 替换错误日期。其他人将有 0 小时。

另外,请注意我稍微替换了您的输入列表理解。它以前允许非整数输入和非数字输入。当输入一个非数字 (>9) 时,我在列表中放置一个 100,然后检查是否有一个并抛出异常。

根据评论编辑:

dates = []
try:
    digits = [int(x) if int(x) < 10 else 100 for x in input("Enter the digits").split(",")]
    if 100 in digits:
        raise ValueError('Must be digits and not numbers')
    datetime_perms = itertools.permutations(digits, 8)
    for date_time in datetime_perms:
        convert_date = []
        for skip in range(0,8,2):
            # Create a list that will look like [Month, Day, Hour, Minute]
            convert_date.append(date_time[skip]*10+date_time[skip+1])
        dates.append(convert_date)
except ValueError as e:
    print(e)

for i, date in enumerate(dates):
    try:
        dates[i] = datetime.datetime(year=1, month=date[0], day=date[1], hour=date[2], minute=date[3])
    except ValueError as e:
        print(dates[i])
        dates[i] = datetime.datetime(1,1,1,1,1,1,1)
if len(dates) > 0:
    maximum = max(dates)
    if maximum.microsecond == 1:
        print('None of the combinations created a valid date')
    else:
        print('Month:', maximum.month, 'Day:', maximum.day, 'Hour:', maximum.hour, 'Minute:', maximum.minute)

这应该可以满足您的需要。对于1,2,3,4,3,2,1,0 的输入,我收到了Month: 12 Day: 31 Hour: 23 Minute: 40 的输出

【讨论】:

  • 非常感谢它现在起作用了,当我输入所有数字时,我在输出中需要最长时间,这意味着如果我输入了 0,0,1, 2,2,2,3,5,9,9,9,9 我想得到输出 12/30 22:59 我们能得到这种输出吗因为我想我们不能 我想不到接下来的事情
  • @BhushanPatil 编辑了答案。
  • 你是最好的我会试着理解请
  • 为什么转换日期的范围是到 8,我们为什么要转换它,你能解释一下吗?
  • 我想要那个 for 循环以避免输入 (date_time[0]*10+date_time[1], date_time[2]*10+date_time[3], date_time[4]*10+date_time[5], date_time[6]*10+date_time[7])。这样,如果我想添加其他内容并使其添加更多内容,我只需要更改一件事。它基本上从 0 到 7 运行(您要求的有 8 位数字,2 代表月,2 代表天等)。我们基本上转换它,因为我想将 2 个数字组合成 1 个数字,这将代表日期和时间所需的数字之一。
猜你喜欢
  • 1970-01-01
  • 2020-02-12
  • 2022-10-13
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多