0

ファイルから読み取り、サブセクションに解析したい数字の文字列があり、サブセクションの長さは文字列内の数字に基づいています。文字列の最初の数値は、最初のサブセクションの長さです。たとえば、次のようなデータの文字列がある場合: 4、11、22、33、3、44、55、5、44、55、66、77

以下のように分けたいと思います。

最初のサブセクションの長さは 4 なので、4、11、22、33

2 番目のサブセクションの長さは 3 なので、3、44、55

3 番目のサブセクションの長さは 5 なので、5、44、55、66、77

スライスで変数を使用してみました。これにより、データを進めながら開始/終了値をインクリメントできるようになりましたが、変数は必要ありません。最初の値が常に次のサブセクションの長さになるように、各サブセクションを削除する方法を考え出しましたが、少しぎこちないようです。

提案をいただければ幸いです-thx

4

3 に答える 3

3

次のようなことができます:

your_list = [4, 11, 22, 33, 3, 44, 55, 5, 44, 55, 66, 77]
subsec = []
it = iter(your_list)
for n in it:
    subsec.append([n] + map(lambda x: next(it), range(int(n-1))))

このようにして、リストを 1 回だけループします。

また

for n in it:
    subsec.append([n] + [next(it) for _ in range(int(n-1))])
于 2013-02-19T01:09:44.807 に答える
1

より複雑なロジックを扱うときは、通常のループを使用することを好みます。

この場合while、リストが空になるまでループを実行し、すでに処理された要素を削除します。セクションが間違っている場合 (つまり、最後のセクションが文字列のサイズを超えている場合)、アサートによって通知されます。

sequence = [4, 11, 22, 33, 3, 44, 55, 5, 44, 55, 66, 77]
sections = []
while sequence:
    section_size = sequence[0]
    assert len(sequence) >= section_size
    sections.append(sequence[:section_size])
    sequence = sequence[section_size:]

print sections

これにより、セクションが分割sectionsされ、例のようにサイズが最初の要素として、というリストに保存されます。

編集:エラーチェックを追加しました。

于 2013-02-19T01:06:41.703 に答える
0

これを捨てようと思っただけです。両方の BoppreH のソリューションに非常に似ていnますが、インデックスを反復処理することで追加のリストを作成するオーバーヘッドを回避します。

def generateSlices(seq):
    i = 0
    while i < len(seq):
        n = x[i]
        yield x[i:i + n]
        i += n

次のようにして、サブリストのリストを生成した後にエラーをチェックできます。

mySubLists = [[5, 23, 33, 44, 2], [10]]

all(len(x) == x[0] for x in mySubLists)

ちなみに、なぜあなたのデータはこの奇妙な方法で構造化されているのですか? エラーが発生しやすいようです。

于 2013-02-19T01:43:05.817 に答える