0

フラット化されたタプルを表す非常に長いリストを扱っています。例えば:

vll = ['1', '.32', '2', '3.234', '3', '.23', '4', '8.987', ... for a long time] 

タプルを再構成し、適切な長さにスライスしたいと考えています。理想的には、タプルに再構成する前にリストをスライスしたいと思います。カスタム メソッドに設定されたスライス値を決定する方法を教えてください。

def tuple_list(vll, tuple_length=2):
    start, stop, step = sliced  # those slice values I don't know how to find
    l = vll[start:stop * tuple_length]  
    tuple_list = zip([int(i) for i in l[0::2]], [float(v) for v in l[1::2]])
    return tuple_list[::step]

したがって、この関数を使用するときは、従来の python リストのようにしたいと思います。

>>> tuple_list(vll)[:2]
>>> [(1, .32), (2, 3.234)]

関数呼び出しでスライス値の引数を作成できることはわかっています。私もこれを行うことができます:

>>> l = vll[:4]
>>> tuple_list = zip([int(i) for i in l[0::2]], [float(v) for v in l[1::2]])
>>> tuple_list
>>> [(1, .32), (2, 3.234)]

また

>>> tuple_list = zip([int(i) for i in vll[0::2]], [float(v) for v in vll[1::2]])
>>> tuple_list[:2]
>>> [(1, .32), (2, 3.234)]

更新: 以下のコードは私の質問に答えます。私が行ったことは、関数ではなくクラスを定義することであり、すべての関数ロジックをクラスの__getitem__メソッド内に配置できます。アプローチに関する考えや意見は素晴らしいでしょう。

class tuple_list(object):
    def __init__(self, flat_list, tuple_length=2):
        self.flat_list = flat_list
        self.tuple_length = tuple_length

    def __getitem__(self, item):
        base_list = self.flat_list[item.start: item.stop * self.tuple_length]

        tuple_list = zip(
            [int(i) for i in base_list[0::2]],
            [float(v) for v in base_list[1::2]]
        )

        return tuple_list[::item.step]

>>> tuple_list(range(1000000))[3:48:9]
>>> [(3, 4.0), (21, 22.0), (39, 40.0), (57, 58.0), (75, 76.0), (93, 94.0)]
4

1 に答える 1

0
all_points = range(100)
slice_size = 3
sliced_points = zip(* [iter(all_points)]*slice_size)

これを行う私のお気に入りの方法は...質問を正しく理解していると仮定して...

ただし、残りのポイント数が奇数の場合は、リストを切り捨てます (たとえば、3 つのスライスが必要な場合に残りのポイントは 2 つだけです)。

このエンドビットが必要な場合は、簡単に十分に行うことができます

sliced_points.append(all_points[-(len(all_points)%slice_size):])

範囲だけを見たい場合my_list = all_points[start:stop]は、グループ化を行っているすべてのポイントの代わりに渡すだけです

于 2013-11-09T21:42:49.740 に答える