我试图找到最近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()
Run Code Online (Sandbox Code Playgroud)
你假设你可以索引([])一个整数来获取一个数字,但这不是你可以用Python中的整数做的事情.你可以做的是将整数转换为字符串,然后你可以索引字符串以从中获取字符:
>>> year = 2015
>>> year_as_string = str(year)
>>> year_as_string[0]
'2'
Run Code Online (Sandbox Code Playgroud)
错误消息提到属性的原因__getitem__是因为year[0]基本上扩展为year.__getitem__(0).信息__getitem__.
我也建议在较小的部分解决这个问题.而不是试图立刻解决整个问题,通过编写一个函数,它启动的一个年会返回True,如果它不具有任何重复的数字和False其他.然后,当你有了这个工作时,你可以编写另一个函数来调用循环中的第一个函数来获得你需要的五个结果.
有几种很好的方法可以解决完整的问题:
列表理解:
>>> [y for y in range(2015, 0, -1) if len(set(str(y))) == 4][0:5]
[2015, 2014, 2013, 1987, 1986]
Run Code Online (Sandbox Code Playgroud)
迭代器:
from itertools import islice
>>> list(islice(filter(lambda y: len(set(str(y))) == 4, range(2015, 0, -1)), 5))
[2015, 2014, 2013, 1987, 1986]
Run Code Online (Sandbox Code Playgroud)
列表理解更简单,但做了更多的工作(它将尝试范围内的所有年份,只丢掉前五个除外); 迭代器版本并不那么简单,但(在Python 3中)只能完成所需的工作量.
| 归档时间: |
|
| 查看次数: |
1226 次 |
| 最近记录: |