从3开始迭代列表

时间:2018-03-09 04:41:34

标签: python python-3.x

我想根据开始日分配0-6。例如,如果星期三是开始日,我应该将星期三定为0,然后星期四定为1,星期五定为2等......

这是我试过的

def date_manipulate(startday):
    #df['Month']=df.index.strftime("%B")
    temp_week=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
    week={}
    currentday=0
    offset=temp_week.index(startday)
    for day in temp_week:
        if temp_week:
            pointer=temp_week.index(day)+offset%len(temp_week)
            if (pointer>=8):
                pointer-=7
            week[temp_week[pointer]]=currentday
            currentday+=1
        else:
            break
    return week

这不会返回正确的数字(即:星期三是7),由于某种原因,它会迭代9次而不是7次。我也尝试从位置3 [3:]开始切片索引,这将跳过前2,这也不是我想要的。最后,我只是试图将一周的开始日改为我定义的而不是周日修复功能。一旦我得到函数工作,我将做一些if语句循环默认的一周,并用这个新的字典替换它。谢谢!

5 个答案:

答案 0 :(得分:2)

default_week =['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

def date_manipulate(startday):
    week = {}
    temp_week = default_week[startday:] + default_week[0:startday]
    for index, day in enumerate(temp_week):
        week[index] = day
    return week

周二的输出作为开始日期(date_manipulate(2)

  

{0:'星期二',1:'星期三',2:'星期四',3:'星期五',4: '星期六',5:'星期天',6:'星期一'}

修改

如果您打算在字典中获取Tuesday: 0而不是0: Tuesday,请使用

week[day] = index

答案 1 :(得分:1)

您可以使用enumerate这样简化您的功能:

def date_manipulate(day):
    temp_week=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
    i = temp_week.index(day)
    return dict(enumerate(temp_week[i:] + temp_week[:i]))

>>> date_manipulate('Wednesday')
>>> {0: 'Wednesday', 1: 'Thursday', 2: 'Friday', 3: 'Saturday', 4: 'Sunday', 5: 'Monday', 6: 'Tuesday'}

>>> date_manipulate('Tuesday')
>>> {0: 'Tuesday', 1: 'Wednesday', 2: 'Thursday', 3: 'Friday', 4: 'Saturday', 5: 'Sunday', 6: 'Monday'}

答案 2 :(得分:1)

您可以将列表拆分为两部分并将它们连接起来。

n = week.index(day)
new_week = week[n:] + week[:n]

在第二个子列表中,它会上升,但不包括n

答案 3 :(得分:0)

您有for day in temp_week:,但唯一的目的是让day成为temp_week.index(day)整数。您不能将day用于其他任何事情。

为什么这么复杂?更简单的是for i in range(7):, 然后只使用i代替temp_week.index(day)

接下来,temp_week.index(day)+offset%len(temp_week) 将采用offsetlen(temp_week),其评估为offset,因为offset始终至少为0且小于len(temp_week); 然后将offset添加到temp_week.index(day),当然有时会提供大于6的结果。

注意运算符的优先级,并在需要时使用括号:

pointer = (temp_week.index(day) + offset) % len(temp_week)

当然,更好的方式是正确使用切片,如Evyatar的回答。

答案 4 :(得分:0)

使用cycledropwhile非常容易使用itertools。逻辑cycle将创建一个无限长的周列表,dropwhile将用于获取“周期”中的第一天:

from itertools import cycle, dropwhile

target_day = 'Wednesday'
week_cycle =  cycle(['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'])
day_number = range(7)

print(list(zip(dropwhile(lambda x: x != target_day, week_cycle), day_number)))

输出

[('Wednesday', 0), ('Thursday', 1), ('Friday', 2), ('Saturday', 3), ('Sunday', 4), ('Monday', 5), ('Tuesday', 6)]

或在函数中

def day_week(day='Wednesday'):
    return list(zip(dropwhile(lambda x: x != target_day, week_cycle), range(7)))