Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将具有二进制元素的数据解析为列表列表?_Python_List_Parsing_Binary - Fatal编程技术网

如何在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'