3

作成したリンク リスト クラスに挿入するファイルにデータ ポイントのリストがあります。
ファイルは、一連の負の値の後に一連の正の値が交互に続くように構成されています。例:

-2323 

-2324

-53434

-1027

-34232

 343434

 5657

 6565

 6500

-343434

-3434

-565

5845

4667

5453

98356

このパターンが何行も続きます。正または負の値の数は、セクションごとに同じになることはありません。

-2323最初のリスト オブジェクトに正から負の数値の最初のセット (この場合はto まで) が含まれるように、これらの値を何らかの方法で分離したいと考えています6500。次のリスト オブジェクトには、 から-343434までの値が含ま98356れます。

ファイルを読み取るときに、これらのデータセットを分離する方法をpythonに知らせる方法がわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

4
import itertools
groups = itertools.groupby(l, lambda x : x > 0)
result = [list(groups[i][1]) + list(groups[i + 1][1]) for i in range(0, len(groups), 2)]

これにより、最初に要素が正かどうかによってグループ化され、次にグループからの隣接するペアが単一のリストに結合され、結果リストの要素になります。

編集: itertools が通常のイテラブルのように機能しないオブジェクトを作成することを忘れがちです。

もう少し厄介な場合、以下は実際に機能するはずです。

import itertools
groups = itertools.groupby(l, lambda x : x > 0)
grouplist = [[i for i in y] for (x, y) in groups]
result = [grouplist[i] + grouplist[i + 1] for i in range(0, len(grouplist), 2)]
于 2013-08-16T20:20:55.647 に答える
2
def takeSection(sequence):
    it = iter(sequence)
    a = -1
    group = []
    while True:
        try:
            a, last = next(it), a
        except StopIteration:
            if group:
                yield group
            return
        if a < 0 and last >= 0:
            if group:
                yield group
            group = [a]
        else:
            group.append(a)

>>> sequence = [-2323, -2324, -53434, -1027, -34232, 343434, 5657, 6565, 6500, -343434, -3434, -565, 5845, 4667, 5453, 98356]
>>> list(takeSection(sequence))
Out[2]: 
[[-2323, -2324, -53434, -1027, -34232, 343434, 5657, 6565, 6500],
 [-343434, -3434, -565, 5845, 4667, 5453, 98356]]

編集

値のペアの最初の値でこれをフィルタリングする場合は、代わりに if 条件を変更してこれをテストできます。たとえば、条件行を に変更できます。また、次のif a[0] < 0 and last[0] >=0ように初期化する必要もありますaa = (-1, -1)

ただし、代わりに、より一般化された便利な関数を作成したいと思います。

def sections(sequence, key):
    it = iter(sequence)
    a = placeholder = object()
    group = []
    while True:
        try:
            a, last = next(it), a
        except StopIteration:
            if group:
                yield group
            return
        if last is not placeholder and key(a, last):
            if group:
                yield group
            group = [a]
        else:
            group.append(a)

>>> sequence = [(-2323, -7465), (-2324, -7687), (-53434, -1027), (-34232, 343434), (5657, 6565), (6500, 978987), (-343434, -987), (-3434, -565), (-98, -8798), (-89898, -898), (5845, 4667), (5453, 98356)]
>>> list(sections(sequence, key=lambda current, last: current[0] < 0 and last[0] >= 0))
Out[1]:
[[(-2323, -7465), (-2324, -7687), (-53434, -1027), (-34232, 343434), (5657, 6565), (6500, 978987)],
 [(-343434, -987), (-3434, -565), (-98, -8798), (-89898, -898), (5845, 4667), (5453, 98356)]]
于 2013-08-16T20:19:58.237 に答える