フラット化されたタプルを表す非常に長いリストを扱っています。例えば:
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)]