用python将字符数组转换为整数
我有一个字符数组形式的数据:用python将字符数组转换为整数,python,data-manipulation,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.st
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)都可以,因为我们无论如何都要将它们写入以制表符分隔的文件中。类似这样的内容:
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]]
我猜,根据你这里的字母,我们说的是DNA碱基对?如果是这样的话,我不得不说,我不认为让0/1变得模棱两可是个好主意。为什么最常见的核苷酸是“0”很重要?(或者我在DNA问题上错了吗?)如果大多数人是
g
c
应该是1,a
是0…@AdamKG是的,这是DNA的东西。这并不含糊,因为虽然我们有4个碱基,但它们总是成对出现,即A和T,C和G,所以在数据分析中,我们只需要两个数字来表示它们。@septi By mainter我的意思是在每一列中,或者在我上面显示的结果中的每个列表中。如果g是多数,则表示为0。不可能有冲突,因为每个列表中只有两种类型的字符。不,我的意思是,您的0表示a/t对还是c/g对不明确。为什么不让它在整个数据集中保持一致呢?除了在字典中应该是int(c1
之外,一切都很好。谢谢
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]]