Python:从列表中获取2个已知项目之间的项目

时间:2015-10-08 14:22:18

标签: python list python-2.7

我正在寻找一种方法来从python列表中获取2个项目之间的所有项目。算法必须扭曲整个数组。

例如:

我有一个像"Mo-Fr"这样的字符串 我想最终得到一个清单:

[Monday, Tuesday, Wednesday, Thursday, Friday]

但我希望它也能以这种方式运作:

string = "Fr-Mo"

list = Friday, Saturday, Sunday, Monday

我的代码看起来就像这样:

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”。 任何想法如何以干净的方式工作?

谢谢!

3 个答案:

答案 0 :(得分: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']


这是另一种方法,这次使用模块化算法,正如David Lemon的评论所示:

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)

答案 1 :(得分: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)

答案 2 :(得分: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

et voila

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']
相关问题