python 将所有行拆分为列,行中没有空格

python split all lines in columns, no spaces in lines

我见过很多将文本文件的行拆分为列的方法,但我没有找到使用不带空格的行的方法。

我的文本文件如下所示:
CABDCBADBCADBC
CBDACBABCABCDA
BCDABCDABABABC
CBADCBACBADBCA

我想把它分成几列,然后处理每一列。所以我应该得到类似的东西:

a = [C,C,B,C]  
b = [A,B,C,B]  
c = [B,D,D,A]  
[...]

那我想知道每个字母在每一列中出现了多少次

看起来很简单,但是我没有做到,也没有找到类似的东西......你有什么想法吗?

这是一个生成器对象,它将 return 每一列在其上调用下一个方法。它假定所有行的长度都相同。但如果不是这样,您可以将附加内容包装在一个简单的 try 和 except 块中

def generateCol(f):
    lines = f.readlines()
    col_count = len(lines[0]) #Assuming all lines are of the same length
    for col in xrange(col_count):
        curr_col = []
        for line in lines:
            curr_col.append(line[col])
        yield curr_col

用法:

gen = generateCol(open('fileName', 'r'))
print gen.next()

如果您希望每个字符都在单独的列中,那么解决方案是所有行的长度都相同

st = \
"""CABDCBADBCADBC
CBDACBABCABCDA
BCDABCDABABABC
CBADCBACBADBCA"""

print zip(*st.split("\n"))

结果:

[('C', 'C', 'B', 'C'), ('A', 'B', 'C', 'B'), ('B', 'D', 'D', 'A'), ('D', 'A', 'A', 'D'), ('C', 'C', 'B', 'C'), ('B', 'B', 'C', 'B'), ('A', 'A', 'D', 'A'), ('D', 'B', 'A', 'C'), ('B', 'C', 'B', 'B'), ('C', 'A', 'A', 'A'), ('A', 'B', 'B', 'D'), ('D', 'C', 'A', 'B'), ('B', 'D', 'B', 'C'), ('C', 'A', 'C', 'A')]

假设所有行的长度都相同并且您使用的是 Python 2 您可以使用 izip and Counter:

from collections import Counter
from itertools import izip

with open('test.txt') as f:
    print [(x, Counter(x)) for x in izip(*(line.strip() for line in f))]

输出(部分):

[
    (('C', 'C', 'B', 'C'), Counter({'C': 3, 'B': 1})), 
    (('A', 'B', 'C', 'B'), Counter({'B': 2, 'A': 1, 'C': 1})), 
    (('B', 'D', 'D', 'A'), Counter({'D': 2, 'A': 1, 'B': 1})),
    ...
]    

假设所有行的长度相同:

with open(path_to_file) as f:
    lines = [line.strip() for line in f.readlines()]  # getting rid of '\n'
    columns = [[line[i] for line in lines] for i in range(len(lines[0]))]

print(columns)  # columns is a list of lists, each list is a column
>> [['C', 'C', 'B', 'C'], ['A', 'B', 'C', 'B'], ... , ['C', 'A', 'C', 'A']]

现在计算每列中的每个字母只是使用 count()collections.Counter:

的问题
from collections import Counter

print([Counter(col) for col in columns])
>>  [Counter({'C': 3, 'B': 1}), Counter({'B': 2, 'C': 1, 'A': 1}), ...,
     Counter({'C': 2, 'A': 2})]