在python中查找没有重复数字的年份
我试图在不重复数字的情况下查找最近5年的数据,并且不断得到错误在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
'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]
问题是您无法访问