我最近一直在问这个问题,并且感觉不太需要这么多帮助,但这个算法看起来很难。
我有一个像这样的元组列表:
[('12 Mar 2011',), ('152', 'Farko', 'Kier'), ('153', 'Park', 'Pub'), ('09 Mar 2011',), ('158', 'Diving', 'Jogging')]
包含日期的元组将始终为len == 1
。现在,我需要将所有以下非日期元组加入每个前一个日期。非日期元组的数量将始终未定义。日期元组将连接序列中的每个非日期元组,直到它接近下一个日期元组,然后该元组必须加入以下所有非日期元组,依此类推。最终的结果应该是:
[('152', 'Farko', 'Kier', '12 Mar 2011'), ('153', 'Park', 'Pub', '12 Mar 2011'), ('158', 'Diving', 'Jogging', '09 Mar 2011',]
如果你不能提供一个现成的代码,也许有一些提示在哪里查看,有什么方法,因为我无法想到我的工具包中可以做得很好的任何内容。
答案 0 :(得分:8)
你可以使用itertools.groupby
来编写它,但命令式生成器函数可能更具可读性:
def join_dates(l):
date = None
for t in l:
if len(t) == 1:
date = t
else:
yield t + date
为了完整性,这是itertools
解决方案:
from itertools import groupby
[t + ds[0] for ds, ts in zip(*[(list(g) for _, g in groupby(l, len))] * 2) for t in ts]
答案 1 :(得分:4)
这样的事情:
In [60]: ans=[]
In [61]: lis=[('12 Mar 2011',), ('152', 'Farko', 'Kier'), ('153', 'Park', 'Pub'), ('09 Mar 2011',), ('158', 'Diving', 'Jogging')]
In [62]: date=None
In [63]: for x in lis:
if len(x)==1:
date=list(x)
else:
if date:
ans.append(list(x)+date)
....:
In [64]: ans
Out[64]:
[['152', 'Farko', 'Kier', '12 Mar 2011'],
['153', 'Park', 'Pub', '12 Mar 2011'],
['158', 'Diving', 'Jogging', '09 Mar 2011']]