Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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 - Fatal编程技术网

Python 列表创建不正确

Python 列表创建不正确,python,Python,我正在尝试根据下面的输入创建一个列表,但没有看到预期的输出。有人能告诉我哪里出了问题吗 输入: CR FA CL Title 409452 WLAN 656885 Age out RSSI values from buffer in Beacon miss scenario 415560 WLAN 656886 To Record SMD Event Logging 我想要像这样的输出 [['CR', 'FA', 'CL', 'TITLE'], ['409452',

我正在尝试根据下面的输入创建一个列表,但没有看到预期的输出。有人能告诉我哪里出了问题吗

输入:

CR  FA  CL  Title
409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
415560  WLAN    656886  To Record SMD Event Logging
我想要像这样的输出

[['CR', 'FA', 'CL', 'TITLE'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886','To Record SMD Event Logging']]
但我看到它被创造成这样

[['CR', 'FA', 'CL', 'TITLE'], ['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario'], ['', '415560', 'WLAN', '656886\tTo Record SMD Event Logging']]
Python代码

 for i in info.splitlines():
    index = re.split(r'\W+',i,3)
    CRlist.append(index)

如果除第一行外的每行开头都有额外的空格,那么您得到的输出正是您所期望的

这样做的一个常见原因是,您试图解析具有错误行尾的文件,但并没有使用通用换行符模式,结果将事情弄糊涂了

例如,这两行在文本编辑器中可能看起来相同:

409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
\r409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
但是您的
re.split
将对它们执行完全不同的操作:

['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario']
['', '409452', 'WLAN', '656885\tAge out RSSI values from buffer in Beacon miss scenario']
解决办法是去掉多余的空白。您可以尝试编写更复杂的regexp,或者只需执行
re.split(r'\W+',s.lstrip(),3)

既然您提到要去除尾随空格,请使用
strip
而不是
lstrip
re.split(r'\W+',s.strip(),3)


但是我不知道为什么您首先要使用regexp,而您可以只使用
s.strip().split(None,3)
我觉得您应该使用
csv
模块,但这里有一个非regex解决方案:

>>> s = '''CR  FA  CL  Title
... 409452  WLAN    656885  Age out RSSI values from buffer in Beacon miss scenario
... 415560  WLAN    656886  To Record SMD Event Logging'''
>>> [x.strip().split(None, 3) for x in s.splitlines()]
[['CR', 'FA', 'CL', 'Title'], ['409452', 'WLAN', '656885', 'Age out RSSI values from buffer in Beacon miss scenario'], ['415560', 'WLAN', '656886', 'To Record SMD Event Logging']]

如果您有\t作为分隔符,则可以使用此分隔符(请注意,您可以使用strip并检查item.strip()是否为空条目,如果为空条目则跳过它):

如果列之间有多个空格,可以尝试使用以下方法:

[[x.strip() for x in row.split('  ') if x.strip()] for row in info.split('\n')]
或组合:

[[x.strip() for x in row.replace('\t', '  ').split('  ') if x.strip()] for row in info.split('\n')]
最后使用split(无,3):


您确定每行的开头没有多余的空格(例如,由于您在没有通用换行符模式的情况下解析了另一个平台的文本文件,所以有多余的
\r
存在)?因为这正是在这种情况下您会看到的。可能会有额外的whilespace,trailing\r\n,我想去掉所有这些。我将您的输入复制到一个文件中,并测试您的代码。没问题。我只能猜测平台差异问题。@oyss:从OP的评论中,我认为差异在于他的实际输入文件与此无关(可能看不见)在复制/粘贴到SO时丢失的空白字符。除非他将输入文件上传到某个我们可以查看的地方,否则这仍然只是一个猜测,尽管我的建议解决了这个问题,这很好地证明了这是一个正确的猜测。这并不能解决他的问题。它与他的原始代码在完全相同的情况下工作。并且它的副作用是将第4列中的所有空格转换为单个空格。它如何将第4列中的空格转换为空格?当前版本没有,但以前的版本有。(或者可能是删除并替换为您的同一位置的不同答案?不确定…)它做到了
split()
,然后将最后一列与
''重新组合。join(x[3])
@wim:当使用
.split()
(或
.split(None,n)
)时,您不需要先
.strip()
字符串。只有在使用
.split('')
(或
.split('',n)
)时才需要这样做字符串可能有前导空格或尾随空格。OP在评论中明确提到“可能有额外的whilespaces,尾随空格,\r\n,我想去掉所有空格”,因此这里需要
strip()
(或
rstrip()
)。(PS,@wim,我想从昨天开始就有了否决票,可能是有人根据我对你的原始版本的评论进行了投票,而不是否决了当前的工作版本。人们这样做很令人沮丧,因为他们再也不会回来了。)为什么不干脆
split(无)
,它在任何空格上拆分,这显然是他想要的(考虑到使用了
r'\W'
)?同时,您正在重写他代码中已经工作的部分。您确实有可能在其中进行了修复(
strip()
),但是没有评论就被扔进去了,所以他无法理解这才是真正重要的。让我不同意-我无法理解他想要在每个空格上拆分,因为最后一列包含一个带有空格的句子,他想要完整的句子-是吗?以及strip不会消除他在表格方面的问题。他说想要在每个空格上拆分,但只在前三个空格上拆分。如果您阅读他的regexp和预期输出,就没有其他可能的含义了。而且我不确定“表格有什么问题”你说的是;
strip
将解决他的代码实际存在的唯一问题。@abarnet-当然,谢谢你,添加了一条评论,让他知道strip的使用及其效果。这只是一个解决方案,没有regex,什么都没有-请容忍我-我只是想给他一个解决方案。你的解决方案+1,比如m更恰当的回答事实上,我喜欢你的回答,因为教他如何编写pythonic代码是一个好主意,而不仅仅是为他修复一些小错误,我只是在旁白中这样做,而你的回答让它成为中心。但你的回答实际上并没有做他似乎想做的事情,它不能处理所有的问题ce,它不会忽略第三次拆分后的空格,等等。如果您只使用
split(None,3)
这将是编写他想要做的事情的最佳方式(比我的答案更好,这只是对他原始代码的一个小改动)。
[[x.strip() for x in row.replace('\t', '  ').split('  ') if x.strip()] for row in info.split('\n')]
[row.split(None, 3) for row in info.split('\n')]