我正在寻找一种方法来从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”。 任何想法如何以干净的方式工作?
谢谢!
答案 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']