嗨,我正在学习用python编写代码,并认为自动化我通常为室友执行的任务会很酷。我列出了每个月的名称和日期列表,以便每个人都知道谁来菜。 这是我的代码:
def dish_day_cycle(month, days):
print('Dish Cycle For %s:' % month)
dish_list = ['Jen', 'Zack', 'Hector', 'Arron']
days = days + 1
for day in range(1, days):
for i in dish_list:
print('%s %s : %s' % (month, day, i))
问题是它每天重复每个人的名字,显然不是我想要的。我需要它每天只打印一个名字。不是这样的:
>>> dish_day_cycle(month, days)
Dish Cycle For December:
December 1 : Jen
December 1 : Zack
December 1 : Hector
December 1 : Arron
December 2 : Jen
December 2 : Zack
December 2 : Hector
December 2 : Arron
December 3 : Jen
December 3 : Zack
December 3 : Hector
December 3 : Arron
December 4 : Jen
December 4 : Zack
December 4 : Hector
December 4 : Arron
December 5 : Jen
December 5 : Zack
December 5 : Hector
December 5 : Arron
请让我知道如何纠正此功能以使其正常工作。
答案 0 :(得分:6)
您使用了一个嵌套的for循环,因此每天-每个名称都与那天一起打印。仅使用外循环,并计算轮到谁。应该是这样的:
for day in range(1, days):
print('%s %s : %s' % (month, day, dish_list[day % len(dish_list)]))
假设您的室友,并且您将碟子平均分配。
答案 1 :(得分:1)
您可以一起浏览两个列表,并使用itertools.cycle
重复较短的列表:
import itertools
for day, person in zip(range(1, days), itertools.cycle(dish_list)):
print('{} {} : {}'.format(month, day, person))
更新:
zip
将两个可迭代对象(range
的天对象和dish_list
)中的元素配对,以从两个可迭代对象创建新的元组对列表。但是,zip
仅创建一个最短可迭代的列表。 itertools.cycle
规避了这个问题,因此zip
循环回到dish_list
。现在,for循环将同时循环这两个循环,而不是以原始代码中的嵌套方式循环。
文档可能比我刚才做的解释更好:zip
,itertools.cycle
答案 2 :(得分:1)
问题在于您要反复浏览几天,然后遍历名称列表。想象一行一行地运行,因为for循环仅在到达项目末尾后才会重复。因此,您在工作中已经说过,每个人每天都要洗碗,这就是为什么要进行所有重复的原因。
更容易的是只有一个for循环,然后将1添加到day并添加到该循环内的dish_list中
person = 0 # this will serve as the index of the list
for day in range(days):
print("%s %s : %s" % (month, day + 1, dish_list[person]))
if person == 3:
person = 0
else:
person += 1
也要指出,定义函数后应该缩进,否则会引发错误。希望这会有所帮助