作为对已回答的另一个问题的后续跟进,我现在拥有以下格式的数据:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
我正在寻找一个python函数(可能是for循环),它实现了以下输出:
34:1
27:1 33:1 36:1
20:1 32:1
注意第一个数字是如何在40长度长位模式中所拥有的位置。第二个数字(冒号后)是原始数字“1”。
我是python的新手,并在这里发布我的问题,这对我学习python有很大的帮助。所以,如果你有任何想法如何做到这一点,请随时回复。再一次,这不是功课,我试图创建一个情绪分析程序,我需要这种数据格式的SVM。另一种格式是TiMBL。
修改
由于某些行仅包含0。令人敬畏:)的输出回答如下,在输出文本文件中产生空行。如何添加防止这种情况发生的功能? 或者创建一个读取文件的新函数,并删除换行符?我有一种感觉会删除所有这些,这可能会给我带来麻烦。
答案 0 :(得分:5)
>>> strs = """0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0"""
>>> for x in strs.splitlines():
print " ".join("{}:{}".format(i,1) for i,y in enumerate(x.split(), 1) if y=='1')
...
34:1
27:1 33:1 36:1
20:1 32:1
对于文件:
>>> with open("abc") as f:
for line in f:
strs = " ".join("{}:{}".format(i,1) for i,y in enumerate(line.split(), 1) if y=='1')
if strs:
print strs
...
34:1
27:1 33:1 36:1
20:1 32:1
abc
包含:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
答案 1 :(得分:0)
你可能正在重新发明轮子。查看执行“稀疏矩阵”操作的库,并考虑它们是否能满足您的需求。
我对你正在解决的问题了解不多,但如果它真的是一个数据分析项目,而不是为解决这些问题创建一个很好的界面,并且你有一些数学背景,那么像R这样的语言或matlab可能值得一看。
答案 2 :(得分:0)
另一种方法是,将问题放在首位,并将输入数据作为选择器提供给itertools.compress函数,该函数针对从1开始的整数序列
import StringIO
from itertools import count, compress, imap
import contextlib
s = '''\
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0
'''
with contextlib.closing(StringIO.StringIO(s)) as f:
for line in f:
selectors = line.strip().split()
selectors = imap(int, selectors)
data = compress(count(1), selectors)
print " ".join("{}:{}".format(x, 1) for x in data)
34:1
27:1 33:1 36:1
20:1 32:1