Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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,我正在编写一个脚本来验证正在安装到特定文件夹的deb包。我是个新手,对python很陌生。我有一个与python apt模块一起工作的脚本,该脚本返回一个列表,其中包含包中所有文件的文件路径。由于一些依赖性问题,我无法再使用python apt模块,因此我尝试调用dpkg来收集信息并将其解析为文件路径列表。下面是我用来获取从dpkg命令返回的项目列表的内容。我需要解析出除了最后一个空格的右边以外的所有内容。最有效的解析方法是什么 self.lists = commands.getoutput("

我正在编写一个脚本来验证正在安装到特定文件夹的deb包。我是个新手,对python很陌生。我有一个与python apt模块一起工作的脚本,该脚本返回一个列表,其中包含包中所有文件的文件路径。由于一些依赖性问题,我无法再使用python apt模块,因此我尝试调用
dpkg
来收集信息并将其解析为文件路径列表。下面是我用来获取从
dpkg
命令返回的项目列表的内容。我需要解析出除了最后一个空格的右边以外的所有内容。最有效的解析方法是什么

self.lists = commands.getoutput("dpkg -c "+deb).split('\n')
结果如下:

list: ['drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:24 ./', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/usr/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:15 ./opt/usr/apps/', '-r--r--r-- ejohnson/ejohnson 179491 2012-03-06 15:15 ./opt/usr/apps/xbean-spring-2.8.jar', '-rw-r--r-- ejohnson/ejohnson    518 2012-03-06 15:15 ./opt/usr/apps/Hello.class', '-r--r--r-- ejohnson/ejohnson 1901653 2012-03-06 15:15 ./opt/usr/apps/spring-1.2.6.jar']
我想重新格式化列表,以便列表中的每个项目都是最后一个空格后的项目,例如
['./','./opt/','./opt/usr/','./opt/usr/apps/'.]


感谢您查看简单,只需将您的列表放入
l
变量中,此代码应该适用于您

[el.split()[-1] for el in l]

使用
split
将每个字符串转换为一个列表。使用相对列表索引获取每个列表的最后一个元素


要获得额外学分,请在一行列表中进行理解。

str.rpartition
可能比
str.split

[x.rpartition(" ")[2] for x in your_list]
对于这里的样本,它的速度是原来的两倍多

$ python -m timeit -s "L=['drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:24 ./', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/usr/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:15 ./opt/usr/apps/', '-r--r--r-- ejohnson/ejohnson 179491 2012-03-06 15:15 ./opt/usr/apps/xbean-spring-2.8.jar', '-rw-r--r-- ejohnson/ejohnson    518 2012-03-06 15:15 ./opt/usr/apps/Hello.class', '-r--r--r-- ejohnson/ejohnson 1901653 2012-03-06 15:15 ./opt/usr/apps/spring-1.2.6.jar']" \
> "[x.split()[-1] for x in L]"
100000 loops, best of 3: 5.2 usec per loop

$ python -m timeit -s "L=['drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:24 ./', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/usr/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:15 ./opt/usr/apps/', '-r--r--r-- ejohnson/ejohnson 179491 2012-03-06 15:15 ./opt/usr/apps/xbean-spring-2.8.jar', '-rw-r--r-- ejohnson/ejohnson    518 2012-03-06 15:15 ./opt/usr/apps/Hello.class', '-r--r--r-- ejohnson/ejohnson 1901653 2012-03-06 15:15 ./opt/usr/apps/spring-1.2.6.jar']" \
> "[x.rpartition(' ')[2] for x in L]"
100000 loops, best of 3: 2.55 usec per loop

$ python -m timeit -s "L=['drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:24 ./', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:14 ./opt/usr/', 'drwxr-xr-x ejohnson/ejohnson 0 2012-03-06 15:15 ./opt/usr/apps/', '-r--r--r-- ejohnson/ejohnson 179491 2012-03-06 15:15 ./opt/usr/apps/xbean-spring-2.8.jar', '-rw-r--r-- ejohnson/ejohnson    518 2012-03-06 15:15 ./opt/usr/apps/Hello.class', '-r--r--r-- ejohnson/ejohnson 1901653 2012-03-06 15:15 ./opt/usr/apps/spring-1.2.6.jar']" \
> "[x.rsplit(' ',1)[1] for x in L]"
100000 loops, best of 3: 3.5 usec per loop

self.lists=[line.split(“”)[-1]用于命令中的line.getoutput(“dpkg-c”+deb.split('\n')]
。但是可以优化。我建议使用
。。。[line.split()[-1]…
。不要建议任何人创建一个具有内置名称的变量,除非其意图是显式地隐藏该内置名称。看起来OP已经使用了该名称。不要为此敲打zeroos。@Marcin,事实上,很好,刚刚更改了该变量的名称。
x.rsplit('',1)[1]
对我来说是最快的。@史蒂文:你也可以使用
rsplit(None,1)[1]
来保留那些任意数量的空间语义。@StevenRumbalski,可能取决于cpu和Python的版本等。我在Core2 cpu上使用Python2.7.2运行它
r分区
在奔腾G850上使用Python2和Python3时也是最快的