Python:在可调用函数中应用切片值

时间:2013-11-09 21:37:06

标签: python

我正在处理一个很长的列表,它代表扁平化的元组。 E.g:

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)]

1 个答案:

答案 0 :(得分: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]而不是你正在进行分组的所有点