使用python将字符数组转换为整数

时间:2013-08-04 19:30:36

标签: python data-manipulation

我有一段以字符数组形式存在的数据:

cgcgcg
aacacg
cgcaag
cgcacg
agaacg
cacaag
agcgcg
cgcaca
cacaca
agaacg
cgcacg
cgcgaa

请注意,每列只包含两种类型的字符。我需要根据它们在列中的百分比将它们转换为整数0或1。例如在第1列中,有8个c和4个a,因此c占大多数,那么我们需要将其编码为0,将另一个编码为1.

使用zip()我可以在python中转置这个数组,并将每列放到一个列表中:

In [28]: lines = [l.strip() for l in open(inputfn)]

In [29]: list(zip(*lines))
Out[29]: 
[('c', 'a', 'c', 'c', 'a', 'c', 'a', 'c', 'c', 'a', 'c', 'c'),
 ('g', 'a', 'g', 'g', 'g', 'a', 'g', 'g', 'a', 'g', 'g', 'g'),
 ('c', 'c', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'a', 'c', 'c'),
 ('g', 'a', 'a', 'a', 'a', 'a', 'g', 'a', 'a', 'a', 'a', 'g'),
 ('c', 'c', 'a', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'c', 'a'),
 ('g', 'g', 'g', 'g', 'g', 'g', 'g', 'a', 'a', 'g', 'g', 'a')]

没有必要将它们严格转换为整数,即'c'到'0'或'c'到int(0)都可以,因为我们打算将它们写入制表符分隔文件。< / p>

1 个答案:

答案 0 :(得分:2)

这样的事情:

lis = [('c', 'a', 'c', 'c', 'a', 'c', 'a', 'c', 'c', 'a', 'c', 'c'),
 ('g', 'a', 'g', 'g', 'g', 'a', 'g', 'g', 'a', 'g', 'g', 'g'),
 ('c', 'c', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'a', 'c', 'c'),
 ('g', 'a', 'a', 'a', 'a', 'a', 'g', 'a', 'a', 'a', 'a', 'g'),
 ('c', 'c', 'a', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'c', 'a'),
 ('g', 'g', 'g', 'g', 'g', 'g', 'g', 'a', 'a', 'g', 'g', 'a')]
def solve(lis):
    for row in lis:
        item1, item2 = set(row)
        c1, c2 = row.count(item1), row.count(item2)
        dic = {item1 : int(c1 < c2), item2 : int(c2 < c1)}
        yield [dic[x] for x in row]
...         
>>> list(solve(lis))
[[0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]]

使用collections.Counter

from collections import Counter
def solve(lis):
    for row in lis:
        c = Counter(row)
        maxx = max(c.values())
        yield [int(c[x] < maxx) for x in row]
...         
>>> pprint(list(solve(lis)))
[[0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0],
 [0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
 [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
 [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
 [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1],
 [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]]