连接lis中的特定元组

2024-05-08 15:43:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近问了很多问题,不觉得需要这么多帮助太舒服,但是这个算法看起来很难。你知道吗

我有这样一个元组列表:

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

如果你不能提供一个现成的代码,也许一些提示,在哪里可以看,什么方法,因为我想不出在我的工具箱中有什么可以在这里做得很好。你知道吗


Tags: 代码算法park列表数量len序列mar
2条回答

您可以使用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]

像这样:

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']]

相关问题 更多 >