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

在python中查找没有重复数字的年份,python,digits,repeat,Python,Digits,Repeat,我试图在不重复数字的情况下查找最近5年的数据,并且不断得到错误'int'对象没有属性'\uu getitem' 这是我的代码,到目前为止,我还不知道它出了什么问题。如能解释如何修复,我们将不胜感激 def find_year(): start = 2015 years = [] while len(years) < 5: if start[0] == start[1]: return False elif st

我试图在不重复数字的情况下查找最近5年的数据,并且不断得到错误
'int'对象没有属性'\uu 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()
def find_year():
开始=2015年
年份=[]
而len(年)<5:
如果开始[0]==开始[1]:
返回错误
elif start[0]==start[2]:
返回错误
elif start[0]==start[3]:
返回错误
elif start[1]==start[2]:
返回错误
elif start[1]==start[3]:
返回错误
elif start[2]==start[3]:
返回错误
其他:
年份。追加(开始)
开始-=1
其他:
印刷年份
查找年份()

您假设可以索引(
[]
)一个整数以从中获取一个数字,但在Python中,这不是整数所能做到的。您可以做的是将整数转换为字符串,然后为字符串编制索引以从中提取字符:

>>> year = 2015
>>> year_as_string = str(year)
>>> year_as_string[0]
'2'
错误消息提到属性
\uuuu getitem\uuuu
的原因是
year[0]
基本上扩展到
year.\uuu getitem\uuuu(0)

此外,我建议在较小的部分解决这个问题。不要试图立刻解决整个问题,首先编写一个函数,该函数需要一年的时间,如果没有任何重复数字,则返回
True
,否则返回
False
。然后,当你完成了这项工作后,你可以编写另一个函数来调用循环中的第一个函数,以得到你需要的五个结果

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

列表理解:

>>> [y for y in range(2015, 0, -1) if len(set(str(y))) == 4][0:5]
[2015, 2014, 2013, 1987, 1986]
[year for year in range(2015, 1915, -1) if len(set(str(year)))==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中)只做它需要做的工作。

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

>>> year = 2015
>>> year_as_string = str(year)
>>> year_as_string[0]
'2'
错误消息提到属性
\uuuu getitem\uuuu
的原因是
year[0]
基本上扩展到
year.\uuu getitem\uuuu(0)

此外,我建议在较小的部分解决这个问题。不要试图立刻解决整个问题,首先编写一个函数,该函数需要一年的时间,如果没有任何重复数字,则返回
True
,否则返回
False
。然后,当你完成了这项工作后,你可以编写另一个函数来调用循环中的第一个函数,以得到你需要的五个结果

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

列表理解:

>>> [y for y in range(2015, 0, -1) if len(set(str(y))) == 4][0:5]
[2015, 2014, 2013, 1987, 1986]
[year for year in range(2015, 1915, -1) if len(set(str(year)))==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中)只做它需要做的工作。

这可能有效,请尝试:

    >> from collections import Counter

    >> year = 2015
    >> list = map(int, str(year))
    >> counts = Counter(list)
    >> counts
      Counter({0: 1, 1: 1, 2: 1, 5: 1})
    >>Counter(list).values()
     [1,1,1,1]
最后一种方法将计算一年中每个数字的出现次数。这应该更有效率。 现在如果你想知道是否有重复的数字,用这个

任何小于4的值都表示有一个数字出现多次。

这可能有效,请尝试:

    >> from collections import Counter

    >> year = 2015
    >> list = map(int, str(year))
    >> counts = Counter(list)
    >> counts
      Counter({0: 1, 1: 1, 2: 1, 5: 1})
    >>Counter(list).values()
     [1,1,1,1]
最后一种方法将计算一年中每个数字的出现次数。这应该更有效率。 现在如果你想知道是否有重复的数字,用这个


任何小于4的值都意味着有一个数字出现不止一次。

这是一个带列表的一行:

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

[2015, 2014, 2013, 1987, 1986]
您可以使用
len(set(str(year))==4来测试是否没有重复的数字。
而
范围(20151915,-1)
限制了我们需要测试的年数。
然后我们用[0:5]对结果进行切片,取前五年(从2015年开始按降序排列)。

这是一个带列表的单行线:

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

[2015, 2014, 2013, 1987, 1986]
您可以使用
len(set(str(year))==4来测试是否没有重复的数字。
而
范围(20151915,-1)
限制了我们需要测试的年数。
然后我们用[0:5]对结果进行切片,取前五年(从2015年开始按降序排列)。

问题是您无法使用索引符号访问整数的位数。一个简单的方法是将其转换为一个数字序列,一个检查重复的简单方法是将该序列转换为一个
集合
,并检查集合的长度是否与数字的数量相同,如果存在任何重复,则不会出现重复-请参阅另一个相关问题

下面的代码从起始年开始查看以前和未来年份。它也会检查起始年份,但从您的问题中不清楚它是否应该这样做

def has_dup_digits(year):
    """ Check if integer year has any repeated digits.
    """
    digits = str(year)
    return len(digits) != len(set(digits))

def find_years(start_year):
    """ Find the 5 years closest to the starting year without repeated digits.
    """
    years = []
    if not has_dup_digits(start_year): # check start year
        years.append(start_year)
    delta = 1
    while len(years) < 5:
        if not has_dup_digits(start_year+delta):
            years.append(start_year+delta)
        if len(years) >= 5:
            break
        if not has_dup_digits(start_year-delta):
            years.append(start_year-delta)
        delta += 1

    print(sorted(years))

find_years(2015)  # --> [2013, 2014, 2015, 2016, 2017]
def有两位数(年份):
“”“检查整型年份是否有任何重复的数字。
"""
数字=str(年)
返回长度(位数)!=len(组(数字))
def查找年份(开始年份):
“”“查找最接近起始年份的5年,无重复数字。
"""
年份=[]
如果没有重复数字(开始年份):#检查开始年份
年份。追加(起始年)
δ=1
而len(年)<5:
如果没有重复数字(起始年份+增量):
年份。追加(起始年份+增量)
如果len(年)>=5:
打破
如果没有重复数字(起始年份增量):
年份。追加(起始年增量)
增量+=1
打印(已排序(年))
查找年份(2015)#-->[2013、2014、2015、2016、2017]

问题是您无法访问