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 に答える