【问题标题】:Joining specific tuples within a list加入列表中的特定元组
【发布时间】:2013-02-27 23:50:27
【问题描述】:

我最近问了很多问题,我觉得需要这么多帮助并不太自在,但这个算法看起来真的很难。

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

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

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

【问题讨论】:

    标签: python python-2.7 list-comprehension


    【解决方案1】:

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

    【讨论】:

    • 你太棒了。谢谢你们!
    【解决方案2】:

    类似这样的:

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

    【讨论】:

    • 也感谢您提供此解决方案 :) 顺便说一句,您使用的解释器在左侧提供了这些 insouts 吗?
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多