【问题标题】:Python sort string array with subtringPython对带有子字符串的字符串数组进行排序
【发布时间】:2013-01-08 05:59:55
【问题描述】:

我有一个数组,其中包含“ps aux”命令的输出。我的目标是使用命令名称列对数组进行排序,但我不知道该怎么做,也找不到答案。

这是我目前的代码

#!/usr/bin/python
import subprocess

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = ps.split('\n')

nfields = len(processes[0].split()) - 1
for row in processes[1:]:
#    print row.split(None, nfields) //This is used to split all the value in the string
     print row

这段代码的输出类似于

...
root        11  0.0  0.0      0     0 ?        S<    2012   0:00 [kworker/1:0H]
root        12  0.0  0.0      0     0 ?        S     2012   0:00 [ksoftirqd/1]
root        13  0.0  0.0      0     0 ?        S     2012   0:00 [migration/2]

...

所以我的目标会有类似的输出,但在最后一列排序,所以最后它看起来像这样

...
root        13  0.0  0.0      0     0 ?        S     2012   0:00 [migration/2]
root        12  0.0  0.0      0     0 ?        S     2012   0:00 [ksoftirqd/1]
root        11  0.0  0.0      0     0 ?        S<    2012   0:00 [kworker/1:0H]
...

你们中有人知道如何做到这一点吗?

【问题讨论】:

  • 您也可以利用 shell 中的排序命令:ps aux | sort --key=10,而不是在 python 中执行此操作。当然,这不会剥离第一行。为此,您需要类似 awk:ps aux | awk 'NR != 1 {print;}' | sort --key=10

标签: python arrays sorting


【解决方案1】:

类似这样的:

#!/usr/bin/env python
import subprocess
from operator import itemgetter

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = [p for p in ps.split('\n') if p]
split_processes = [p.split() for p in processes]

然后像这样打印出你的结果:

for row in sorted(split_processes[1:], key=itemgetter(10)):
    print " ".join(row)

或者像这样(如果你只想要进程名称和参数):

for row in sorted(split_processes[1:], key=itemgetter(10)):
    print " ".join(row[10:])

【讨论】:

    【解决方案2】:
    sorted(..., key=lambda x: x.split()[10])
    

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2014-01-05
      • 2022-11-25
      • 2021-02-04
      • 1970-01-01
      • 2016-07-18
      相关资源
      最近更新 更多