我有数据集行,如:
"1234567 12345 123456789"
...
...
每列都有一个指定的块长度,即第一列8“1234567”,第二列6和第三列9个字符,依此类推。
我可以将它们分开:
line="1234567 12345 123456789"
datahash[0]=line[0:8]
datahash[1]=line[9:15]
datahash[2]=line[16:25]
但这是最蟒蛇和最有效的方式吗?
我能用正则表达式实现这一目标吗?它会更有效率吗?
答案 0 :(得分:2)
sample = (
"1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789",
)
def slices_at(sequence,offsets=((0,7),(8,13),(14,25))):
for line in sequence:
yield tuple(line[x:y] for (x,y) in offsets)
result = list(slices_at(sample))
收率:
>>> result
[('1234567', '12345', '123456789'), ('1234567', '12345', '123456789'), ('1234567', '12345', '123456789'), ('1234567', '12345', '123456789')]
重新阅读你的问题,我已经意识到你想要前两个字段的终止空白。
这是一个采用块长度列表的新函数:
def slices_by_block_length(sequence,block_lengths=(8,6,9)):
prev = 0
offsets = []
for length in block_lengths:
offsets.append((prev,prev+length))
prev += length
for line in sequence:
yield tuple(line[x:y] for (x,y) in offsets)
收率:
[('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789')]
答案 1 :(得分:0)
您也可以拆分空格。这样你就不会使用索引,但解决方案仍然很强大。
sample = ["1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789"]
def getValues(line):
return line.split()
for line in sample:
print getValues(line)
将产生您想要的信息。
答案 2 :(得分:0)
我更喜欢进一步的解决方案:
def slice_by_block_length(self,s,block_lengths):
arr=[]
for i in range(len(block_lengths)):
arr.append(s[sum(block_lengths[0:i]):sum(block_lengths[0:i+1])])
return arr
致电:
linearr=myClass.slice_by_block_length(sequence,[8,6,9])