使用功能打印带有人名和日期的月份列表

时间:2018-12-29 00:41:27

标签: python

嗨,我正在学习用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

请让我知道如何纠正此功能以使其正常工作。

3 个答案:

答案 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循环将同时循环这两个循环,而不是以原始代码中的嵌套方式循环。

文档可能比我刚才做的解释更好:zipitertools.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

也要指出,定义函数后应该缩进,否则会引发错误。希望这会有所帮助