如何在Python中将具有二进制元素的数据解析为列表列表?
示例如下所示:如何在Python中将具有二进制元素的数据解析为列表列表?,python,list,parsing,binary,Python,List,Parsing,Binary,示例如下所示: lst = ['ms 20 3 -s 10 \n', '17954 11302 58011\n', '\n', '$$\n', 'segsites: 10\n', 'positions: 0.0706 0.2241 0.2575 0.889 \n', '0001000010\n', '0101000010\n', '0101010010\n', '0001000010\n', '\n', '$$\n', 'segsites: 10\n', 'positions: 0.0038 0
lst = ['ms 20 3 -s 10 \n', '17954 11302 58011\n', '\n', '$$\n', 'segsites: 10\n', 'positions: 0.0706 0.2241 0.2575 0.889 \n', '0001000010\n', '0101000010\n', '0101010010\n', '0001000010\n', '\n', '$$\n', 'segsites: 10\n', 'positions: 0.0038 0.1622 0.1972 \n', '0110000110\n', '1001001000\n', '0010000110\n', '$$\n', 'segsites: 10\n', 'positions: 0.0155 0.0779 0.2092 \n', '0000001011\n', '0000001011\n', '0000001011\n']
每个新的集合都以$$开头。我需要解析数据,这样我就有了下面的列表
sample = [['0001000010', '0101000010', '0101010010', '0001000010'],['0110000110', '1001001000', '0010000110'],['0000001011', '0000001011', '0000001011'] # Required Output
尝试的代码
sample =[[]]
sample1 = ""
seqlist = []
for line in lst:
if line.startswith("$$"):
if line in '01': #Line contains only 0's or 1
sample1.append(line) #Append each line that with 1 and 0's in a string one after another
sample.append(sample1.strip()) #Do this or last line is lost
print sample
Output:[[], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
我是一个分析数据的新手,并试图找出如何正确处理这些数据。关于如何修改代码以及解释的建议非常感谢 您的问题(至少)在这里:如果行在'01'中
如果line='0'或line='1',这一行的意思是,这绝对不是您想要的
一种基本但有效的方法是,如果每个字符串仅由0
和1
组成,则对其进行测试:
def is_binary(string) :
for c in string :
if c not in '01' :
return False
return True
如果string
可以解释为二进制值,则此函数返回True
,否则返回False
当然,您必须在最后管理“\n”,但您已经掌握了主要思想;) 我会用以下方法来做:
import re
lst = ['ms 20 3 -s 10 \n', '17954 11302 58011\n', '\n', '$$\n', 'segsites: 10\n', 'positions: 0.0706 0.2241 0.2575 0.889 \n', '0001000010\n', '0101000010\n', '0101010010\n', '0001000010\n', '\n', '$$\n', 'segsites: 10\n', 'positions: 0.0038 0.1622 0.1972 \n', '0110000110\n', '1001001000\n', '0010000110\n', '$$\n', 'segsites: 10\n', 'positions: 0.0155 0.0779 0.2092 \n', '0000001011\n', '0000001011\n', '0000001011\n']
result = []
curr_group = []
for item in lst:
item = item.rstrip() # Remove \n
if '$$' in item:
if len(curr_group) > 0: # Check to see if binary numbers have been found.
result.append(curr_group)
curr_group = []
elif re.match('[01]+$', item): # Checks to see if string is binary (0s or 1s).
curr_group.append(item)
result.append(curr_group) # Appends final group due to lack of ending '$$'.
print(result)
基本上,您希望遍历这些项,直到找到“$$”
,然后将以前找到的任何二进制字符添加到最终结果中,并启动一个新组。找到的每个二进制字符串(使用正则表达式)都应该添加到当前组中
最后,您需要添加最后一组二进制数,因为没有尾随的“$$”
,但我似乎很难使它适用于我的原始数据集。在我的原始数据集中,分隔符($$)是不同的。一旦我更改了分隔符的类型,输出将崩溃。抱歉,我正在做晚餐-您是否应该更改行:如果项:
中的“$$”,以便它查找不同类型的分隔符,例如,如果您的分隔符是“@@@”
,则它看起来像:如果项:
中的“@@@”。还是你的问题更微妙?没关系。我确实这样做了,但奇怪的是,它没有工作eval.in/673188Ah只是看到了你的链接。您的问题是您假设正则表达式模式$
与分隔符相关。事实并非如此。特别是正则表达式模式中的$
意味着前面的正则表达式命令必须满足字符串的结尾,否则正则表达式将不匹配。这将停止字符串上的匹配,如'01010NOTBINARY'
。