2015-10-08 46 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'] 
相關問題