2015-10-08 40 views
3

即时通过了解其他人介于其中的2个项目来寻找一种方法从python列表中获取所有项目,但是如果它到达结尾,它也应该从头开始。Python:从列表中获取2个已知项目之间的项目

有点很难形容,但这里是我的例子:

我有一个像“周一至周五” 一个字符串,我想用一个列表来结束: 周一,周二,周三,周四,周五

,但我想它也以这种方式工作: 字符串=“FR-莫” 名单=周五,周六,周日,周一

我的代码看起来此刻是这样的:

string = 'Mo-Fr' 
days_order = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'] 
days_dict = {'Mo' : 'Montag', 
      'Di' : 'Dienstag', 
      'Mi' : 'Mittwoch', 
      'Do' : 'Donnerstag', 
      'Fr' : 'Freitag', 
      'Sa' : 'Samstag', 
      'So' : 'Sonntag',} 
days = string.split('-') 
days = [days_order.index(day) for day in days] 
days_list = [days_dict[day] for day in days_order if days_order.index(day) in range(days[0], days[1] + 1)] 

所以我的代码工作正常,如果字符串看起来像“Mo-Fr”,但当然不适用于“Fr-Mo”。 任何想法如何让这个工作干净的方式?

谢谢!

+0

这可能是其中好醇”老式while循环是最清洁溶液中的场合。 – Obversity

+1

您可以将日期顺序存储为0-6整数,然后您可以比较并重新排序。 – cafebabe1991

+2

使用模块运算符获得约束为0-6的安全性。 i的范围代码(10):print i%7为范围(10)中的i生成:print i%7产生此输出0 1 2 3 4 5 6 0 1 2 3 ... –

回答

3

一个简单的解决方案是,使其包含了平日的所有旋转翻一番days_order列表:

>>> days_order = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'] * 2 

然后得到的开始/结束索引是这样的:

>>> string = 'Fr-Mo' 
>>> days = string.split('-') 
>>> start = days_order.index(days[0]) 
>>> end = days_order.index(days[1], start + 1) + 1 

终于打造这样的天数列表:

>>> [days_dict[day] for day in days_order[start:end]] 
['Freitag', 'Samstag', 'Sonntag', 'Montag'] 
+0

这就是我24分钟前所说的。 :)虽然,我正在切片清单上执行第二个索引步骤,而不是提供起始索引。 –

+0

感谢这个答案,这是基于我的例子...它的工作很好 – Sonic

+0

它是唯一的解决方案在这里适用于'迪迪' - 做得很好。 – rebeling

0

下面是该函数:

def AtoB (string, lst): 
    a, b = string.split("-") 
    sublist = [] 
    i = lst.index(a) 
    while lst[i] != b: 
     sublist.append(lst[i]) 
     i+=1 
     i%=len(lst) 
    return sublist + [b] 

这样使用它:

days = AtoB(string, days_order) 
3

一个简单的方法来做到这一点是使用days_order清单一式两份,然后切片该列表分两步进行。

days_order = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'] 
days_dict = { 
    'Mo' : 'Montag', 
    'Di' : 'Dienstag', 
    'Mi' : 'Mittwoch', 
    'Do' : 'Donnerstag', 
    'Fr' : 'Freitag', 
    'Sa' : 'Samstag', 
    'So' : 'Sonntag', 
} 

def daylist(days): 
    first, last = days.split('-') 

    days = days_order * 2 
    i = days.index(first) 
    days = days[i:] 

    i = days.index(last) 
    days = days[:i+1] 
    return [days_dict[s] for s in days] 

s = "Mo-Fr" 
print s, daylist(s) 

s = "Fr-Mo" 
print s, daylist(s) 

输出

Mo-Fr ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag'] 
Fr-Mo ['Freitag', 'Samstag', 'Sonntag', 'Montag'] 

上面的代码只是返回单个日子,如果两个给定的项是相同的。如果在这种情况下需要完整的周期,那么可以使用ekhumoro的算法。

这里是我的版本:

days_order = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'] 
days_dict = { 
    'Mo' : 'Montag', 
    'Di' : 'Dienstag', 
    'Mi' : 'Mittwoch', 
    'Do' : 'Donnerstag', 
    'Fr' : 'Freitag', 
    'Sa' : 'Samstag', 
    'So' : 'Sonntag', 
} 

def daylist(days): 
    first, last = days.split('-') 

    days = days_order * 2 
    i = days.index(first) 
    j = days.index(last, i + 1) 
    return [days_dict[s] for s in days[i:j+1]]  

s = "Mo-Fr" 
print s, daylist(s) 

s = "Fr-Mo" 
print s, daylist(s) 

s = "Di-Di" 
print s, daylist(s) 

s = "Do-Mi" 
print s, daylist(s) 

输出

Mo-Fr ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag'] 
Fr-Mo ['Freitag', 'Samstag', 'Sonntag', 'Montag'] 
Di-Di ['Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag', 'Montag', 'Dienstag'] 
Do-Mi ['Donnerstag', 'Freitag', 'Samstag', 'Sonntag', 'Montag', 'Dienstag', 'Mittwoch'] 


下面是使用模块化运算的另一种方法,这一次,在由大卫柠檬评论建议:

days_short = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'] 
days_long = [ 
    'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 
    'Freitag', 'Samstag', 'Sonntag' 
] 

def daylist(days): 
    first, last = days.split('-') 

    i = days_short.index(first) 
    j = days_short.index(last) 
    if j <= i: 
     j += 7 

    return [days_long[k % 7] for k in range(i, j+1)] 

s = "Mo-Fr" 
print s, daylist(s) 

s = "Fr-Mo" 
print s, daylist(s) 

s = "Di-Di" 
print s, daylist(s) 

s = "Do-Mi" 
print s, daylist(s) 
+0

感谢您的详细示例基于我的代码!非常棒!易于理解 – Sonic

+0

'迪迪'呢? – rebeling

+0

@rebeling:索尼克在这个问题中没有提到在两个给定日期相同的情况下需要全天周期。但是我会在我的答案中添加更多的代码。 –

0

将days_order循环一次:

for from_to in ['Di-Sa', 'Fr-Mi', 'Di-Di']: 

    start_matched, collect_for_buffer = False, True 
    head, buffer, tail = [], [], [] 
    _from, _to = from_to[-2:], from_to[:2] 

    for x in days_order: 

     if _from == x: 
      tail.append(days_dict[x]) 
      if start_matched is False: 
       tail = buffer + tail 
      start_matched = False 

     else: 
      if start_matched is False and collect_for_buffer: 
       buffer.append(days_dict[x]) 

     if _to == x or start_matched: 
      start_matched = True 
      head.append(days_dict[x]) 

    print from_to, head + tail 

等瞧

Di-Sa ['Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'] 
Fr-Mi ['Freitag', 'Samstag', 'Sonntag', 'Montag', 'Dienstag', 'Mittwoch'] 
Di-Di ['Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag', 'Montag', 'Dienstag'] 
相关问题