我在一个文件中有一个数据点列表,我正在将其插入到我构建的链表类中。
文件的组织方式是,有一系列的负值,后跟一系列的正值,前后交替。
例如:
-2323
-2324
-53434
-1027
-34232
343434
5657
6565
6500
-343434
-3434
-565
5845
4667
5453
98356
这种模式持续了许多行每个部分的负值或正值的数目都不相同。
我想以某种方式分离这些值,以便第一个list对象包含第一组正数到负数,在本例中是从
-2323
到6500
下一个list对象将包含从-343434
到98356
的值,依此类推。我不知道如何让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)]]