我试图解决以下练习,而不使用datetime!
练习:
给定一个int列表,这样前三个int代表一个日期, 第二个三个元素代表一个日期等。通过分组修改lst 一个字符串中的每个三元组,数字由“/".
分隔
示例:
lst = [1, 2, 2013, 23, 9, 2011, 10, 11, 2000]
groupd(lst)
lst
['1/2/2013', '23/9/2011', '10/11/2000']
我的尝试:
lst = [1, 2, 2013, 23, 9, 2011, 10, 11, 2000].
stri = str(lst).
def groupd(lst):.
cont = 1.
a = (stri.replace(',', '/')).
for x in lst:.
if len[x]>2:.
lst.insert(lst[0],a )].
print(a).
print(groupd(lst)).
PS:对不起我的英文!!谢谢大家!
答案 0 :(得分:2)
您可以使用zip
创建元组,然后将它们格式化为字符串:
>>> ['%d/%d/%d' % parts for parts in zip(lst[::3], lst[1::3], lst[2::3])]
['1/2/2013', '23/9/2011', '10/11/2000']
从跳过项目(切片的第三个参数)的偏移量(第一个参数到切片)开始允许窗口化行为。
更一般地说:
>>> N = 3
>>> ['/'.join(['%d'] * N) % parts for parts in zip(*[lst[start::N] for start in range(N)])]
['1/2/2013', '23/9/2011', '10/11/2000']
答案 1 :(得分:1)
您可以使用groupby
中的itertools
按照索引对列表进行分组:
from itertools import groupby
['/'.join(str(i[1]) for i in g) for _, g in groupby(enumerate(lst), key = lambda x: x[0]/3)]
# ['1/2/2013', '23/9/2011', '10/11/2000']
答案 2 :(得分:0)
这是一种功能性方法,其中答案通过递归函数传递。
lst1 = [1, 2, 2013, 23, 9, 2011, 10, 11, 2000]
lst2 = []
lst3 = [1,2, 2015]
lst4 = [1,2]
lst5 = [1]
lst6 = [1,2,2013, 23, 9]
def groupToDate(lst, acc):
if len(lst) < 3:
return acc
else:
# take first elements in list
day = lst[0]
month = lst[1]
year = lst[2]
acc.append(str(day) + '/' + str(month) + '/' + str(year))
return groupToDate(lst[3:len(lst)], acc)
print(groupToDate(lst1, []))
print(groupToDate(lst2, []))
print(groupToDate(lst3, []))
print(groupToDate(lst4, []))
print(groupToDate(lst5, []))
print(groupToDate(lst6, []))
如果您不想使用列表推导或groupby,它也是解决此类问题的基本方法