0

次の形式のリストをチャンク化する現在の方法は何ですか["record_a:", "x"*N, "record_b:", "y"*M, ...]。つまり、各レコードの開始が「:」で終わる文字列で示され、次のレコードまでのすべての要素が含まれるリストです。したがって、次のリスト:

["record_a:", "a", "b", "record_b:", "1", "2", "3", "4"]

に分割されます:

[["record_a", "a", "b"], ["record_b", "1", "2", "3", "4"]]

リストには任意の数のレコードが含まれ、各レコードには任意の数のリスト項目が含まれます(次のレコードが開始されるまで、またはレコードがなくなるまで)。これを効率的に行うにはどうすればよいですか。

4

4 に答える 4

4
lst = ["record_a:", "a", "b", "record_b:", "1", "2", "3", "4"]
out = []
for x in lst:
    if x[-1] == ':':
        out.append([x])
    else:
        out[-1].append(x)
于 2013-01-29T22:45:53.123 に答える
4

ジェネレーターを使用します。

def chunkRecords(records):
    record = []
    for r in records:
        if r[-1] == ':':
            if record:
                yield record
            record = [r[:-1]]
        else:
            record.append(r)
    if record:
        yield record 

次に、それをループします。

for record in chunkRecords(records):
    # record is a list

または、もう一度リストに入れます。

records = list(chunkRecords(records))

後者の結果は次のとおりです。

>>> records = ["record_a:", "a", "b", "record_b:", "1", "2", "3", "4"]
>>> records = list(chunkRecords(records))
>>> records
[['record_a', 'a', 'b'], ['record_b', '1', '2', '3', '4']]
于 2013-01-29T22:46:44.673 に答える
1

さて、これが私の一日の終わりのクレイジーなitertoolsソリューションです:

>>> from itertools import groupby, count
>>> d = ["record_a:", "a", "b", "record_b:", "1", "2", "3", "4"]
>>> groups = (list(g) for _, g in groupby(d, lambda x: x.endswith(":")))
>>> git = iter(groups)
>>> paired = ((next(git), next(git)) for _ in count())
>>> combined = [ [a[0][:-1]] + b for a,b in paired]
>>> 
>>> combined
[['record_a', 'a', 'b'], ['record_b', '1', '2', '3', '4']]

(私が必然的に使用するコードの一部としてではなく、実行できる種類のことの例としてより多くのことを行います。)

于 2013-01-29T23:20:58.303 に答える
1
from itertools import groupby,izip,chain

l = ["record_a:", "a", "b", "record_b:", "1", "2", "3", "4"]

[list(chain([x[0][0].strip(':')], x[1])) for x in izip(*[(list(g) 
            for _,g in groupby(l,lambda x: x.endswith(':')))]*2)]

アウト:

[['record_a', 'a', 'b'], ['record_b', '1', '2', '3', '4']]
于 2013-01-29T23:32:59.157 に答える