Skip to main content
 首页 » 编程设计

python之在python中查找没有重复数字的年份

2025年05月04日10Renyi-Fan

我试图在不重复数字的情况下找到最近 5 年,但我一直收到错误 'int' object has no attribute '__getitem__'

这是我的代码,到目前为止 - 我无法弄清楚它有什么问题。任何有关如何修复它的解释都将受到赞赏。

def find_year(): 
    start = 2015 
    years = [] 
    while len(years) < 5: 
        if start[0] == start[1]: 
            return False 
        elif start[0] == start[2]: 
            return False 
        elif start[0] == start[3]: 
            return False 
        elif start[1] == start[2]: 
            return False 
        elif start[1] == start[3]: 
            return False 
        elif start[2] == start[3]: 
            return False 
        else: 
            years.append(start) 
            start -= 1 
     else: 
          print years 
 
 find_year() 

请您参考如下方法:

您假设您可以索引 ([]) 一个整数以从中获取数字,但这不是您可以在 Python 中使用整数做的事情。您可以做的是将整数转换为字符串,然后您可以索引该字符串以从中获取字符:

>>> year = 2015 
>>> year_as_string = str(year) 
>>> year_as_string[0] 
'2' 

错误消息提到属性 __getitem__ 的原因是因为 year[0] 基本上扩展为 year.__getitem__(0)。 Info on __getitem__ .

另外,我建议在更小的部分解决这个问题。与其尝试一次解决整个问题,不如先编写一个耗时 1 年的函数,如果没有任何重复数字和 将返回 True >False 否则。然后,当你完成这项工作后,你可以编写另一个函数,在循环中调用第一个函数,以获得你需要的五个结果。

有几个很好的方法可以解决整个问题:

列表理解:

>>> [y for y in range(2015, 0, -1) if len(set(str(y))) == 4][0:5] 
[2015, 2014, 2013, 1987, 1986] 

迭代器:

from itertools import islice 
>>> list(islice(filter(lambda y: len(set(str(y))) == 4, range(2015, 0, -1)), 5)) 
[2015, 2014, 2013, 1987, 1986] 

列表推导式更简单但做了更多的工作(它将尝试范围内的所有年份,只抛出除前五个以外的所有年份);迭代器版本并不那么简单,但(在 Python 3 中)只做它需要的工作。