有什么方法可以对 python 中的两个字符串进行 AND 操作吗?
Is there some way to AND two strings in python?
所以我有几个非常大的文件,它们代表人类基因组中的每个位置。这两个文件都是基因组中每个位置的某种类型 "score" 的二进制掩码,我有兴趣获得一个新的掩码,其中两个分数都是“1”,即两个掩码的交集。
例如:
File 1: 00100010101
File 2: 11111110001
Desired output: 00100010001
在python中,将这些大文件(它们包含 50-2.5 亿个字符)读入字符串非常快。但是,我不能只是 &
将字符串组合在一起。我可以做类似
的事情
bin(int('0001',2) & int('1111', 2))
但是有没有更直接的方法不需要我填充额外的 0 并在最后转换回字符串?
我认为将二进制与运算转换为内置整数类型可能比逐字符工作快得多(因为 Python 的 int
是用 C 编写的,而不是比 Python)。我建议处理输入文件的每一行,而不是一次处理整个数百万个字符的字符串。二进制与操作不需要任何进位,因此每行单独操作没有问题。
为避免笨拙的字符串操作将结果填充到正确的长度,您可以使用 str.format
方法一次性将整数转换为正确长度的二进制字符串。这是将输出写入新文件的实现:
import itertools
with open(filename1) as in1, open(filename2) as in2, open(filename3, "w") as out:
for line1, line2 in itertools.izip(in1, in2):
out.write("{0:0{1}b}\n".format(long(line1, 2) & long(line2, 2), len(line1) - 1))
我正在使用字符串格式化迷你语言的一个巧妙功能,使用第二个参数来传递转换后数字的所需长度。如果您可以依赖始终具有恰好 50 个二进制数字的行(包括在文件末尾),则可以使用 {:050b}
对长度进行硬编码,而不是根据输入行的长度计算它。
所以我有几个非常大的文件,它们代表人类基因组中的每个位置。这两个文件都是基因组中每个位置的某种类型 "score" 的二进制掩码,我有兴趣获得一个新的掩码,其中两个分数都是“1”,即两个掩码的交集。
例如:
File 1: 00100010101
File 2: 11111110001
Desired output: 00100010001
在python中,将这些大文件(它们包含 50-2.5 亿个字符)读入字符串非常快。但是,我不能只是 &
将字符串组合在一起。我可以做类似
bin(int('0001',2) & int('1111', 2))
但是有没有更直接的方法不需要我填充额外的 0 并在最后转换回字符串?
我认为将二进制与运算转换为内置整数类型可能比逐字符工作快得多(因为 Python 的 int
是用 C 编写的,而不是比 Python)。我建议处理输入文件的每一行,而不是一次处理整个数百万个字符的字符串。二进制与操作不需要任何进位,因此每行单独操作没有问题。
为避免笨拙的字符串操作将结果填充到正确的长度,您可以使用 str.format
方法一次性将整数转换为正确长度的二进制字符串。这是将输出写入新文件的实现:
import itertools
with open(filename1) as in1, open(filename2) as in2, open(filename3, "w") as out:
for line1, line2 in itertools.izip(in1, in2):
out.write("{0:0{1}b}\n".format(long(line1, 2) & long(line2, 2), len(line1) - 1))
我正在使用字符串格式化迷你语言的一个巧妙功能,使用第二个参数来传递转换后数字的所需长度。如果您可以依赖始终具有恰好 50 个二进制数字的行(包括在文件末尾),则可以使用 {:050b}
对长度进行硬编码,而不是根据输入行的长度计算它。