3

我最近一直在问很多,并且不需要这么多帮助感觉不太舒服,但是这个算法看起来真的很难。

我有一个这样的元组列表:

[('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',]

如果您不能提供现成的代码,也许会提示在哪里查看,什么方法,因为我想不出我的工具包中可以在这里做得很好的任何东西。

4

2 回答 2

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]
于 2013-03-12T12:54:18.030 回答
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']]
于 2013-03-12T13:01:23.373 回答