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)

是我最喜欢的方法吗...假设我正确理解了这个问题...

但是,如果剩余的点数为奇数(例如,只剩下 2 个点,需要 3 个切片),它会截断列表

如果你想要这个结束位,你可以很容易地做到

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

如果您只想查看一个范围,请传入my_list = all_points[start:stop]而不是您进行分组的所有点

于 2013-11-09T21:42:49.740 回答