我在一个文件中有一个数据点列表,我正在将其插入到我构建的链表类中。
文件的组织方式是,有一系列的负值,后跟一系列的正值,前后交替。
例如:

-2323

-2324

-53434

-1027

-34232

 343434

 5657

 6565

 6500

-343434

-3434

-565

5845

4667

5453

98356

这种模式持续了许多行每个部分的负值或正值的数目都不相同。
我想以某种方式分离这些值,以便第一个list对象包含第一组正数到负数,在本例中是从-23236500下一个list对象将包含从-34343498356的值,依此类推。
我不知道如何让python知道如何在读取文件时分离这些数据集。
任何帮助都将不胜感激!

最佳答案

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,还需要将a初始化为a = (-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)]]

10-04 13:51