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 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。真棒:) 答案的输出在下面,在输出文本文件中产生空行。如何添加防止这种情况发生的功能?或者创建一个读取文件并删除换行符的新函数?我有一种感觉会删除所有这些,这可能会给我带来问题。

4

3 回答 3

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
于 2013-06-03T15:41:55.100 回答
0

你可能正在重新发明轮子。寻找执行“稀疏矩阵”操作的库,并考虑它们是否会满足您的需求。

我不太了解您要解决的问题,但如果它真的是一个数据分析项目,而不是为解决此类问题生成一个很好的界面,并且您有一点数学背景,那么 R 或 matlab 之类的语言可能值得一看。

于 2013-06-03T16:25:28.107 回答
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
于 2013-06-03T18:50:42.933 回答