练习python:如何在列表中对元素进行分组?

时间:2016-09-17 22:53:51

标签: python list

我试图解决以下练习,而不使用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:对不起我的英文!!谢谢大家!

3 个答案:

答案 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,它也是解决此类问题的基本方法