如何通过遍历具有相同键的多个值的列表来创建字典?

时间:2018-12-04 22:15:17

标签: python pandas list dictionary dataframe

我有df命令的输出来检查我的文件系统。我从os.command那里得到的,然后将其添加到列表中。现在,我正在逐行实现,并想创建一个字典,因为以后需要将响应作为json发送。

Filesystem          Size  Used Avail Use% Mounted on
/dev/xxxx/yyy       9.8G  3.2G  6.1G  35% /
tmpfs               32G     0   32G   0% /dev/shm
/dev/sss            247M  106M  129M  46% /boot
/dev/aaa/ccc        1.5G  205M  1.2G  15% /home
/dev/bbb/ddd        2.2G  152M  2.0G   8% /opt

我想要的是:

{
Filesystem:/dev/xxxx/yyy
{ 
Size: 9.8G
Used:
Avail:
Use%:
Mounted on:
}
Filesystem:tmpfs
{ 
Size: 
Used:
Avail:
Use%:
Mounted on:
}
Filesystem:/dev/sss
{ 
Size: 
Used:
Avail:
Use%:
Mounted on:
}
}

到目前为止,我的代码是:

output = os.popen('df -Ph')
df_contents=output.readlines()
for line in df_contents:
    print(line)

我想了解这是否可行,因为我拥有具有不同值的相同键,如果可以,那么在python中执行此操作的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

要回答您的问题,不,您不能在同一词典中使用相同名称的不同键。但是,如果您仍按FileSystem将所有内容分组,则可以使字典的键本身就是FileSystem的值,在这种情况下,字典将如下所示:

{ '/dev/xxxx/yyy': {'Size': '9.8G', 'Used': '3.2G', ... }
  'tmpfs: {'Size': '32G', 'Used': '0', ... }
   ... and so on.
}

假设df_contents中的每一行的数据都由空格(不一定是制表符)分隔,并且任何值本身都没有空格,那么您可以使用.split()来拆分每行线。

var_keys = ['Size', 'Used', 'Avail', 'Use%', 'Mounted on']
mydict = {}
for line in df_contents:
    # This next command breaks the line into a list, 
    # like ['/dev/xxxx/yyy', '9.8G', '3.2G', '6.1G', '35%', '/']
    values = line.split()
    mydict[values[0]] = dict(zip(var_keys, values[1:]))

答案 1 :(得分:0)

将会很接近这个:

headers = [
  'Size',
  'Used',
  'Avail',
  'Use%',
  'Mounted',
]

lines = [line.strip().split() for line in df_contents if line.strip()]

{line[0]: dict(zip(headers, line[1:])) for line in lines}

答案 2 :(得分:0)

也许您可以使用compat和df.to_json

import pandas as pd
from pandas.compat import StringIO
df_contents = pd.read_csv(StringIO(output.read()), sep = '\t')
df_contents.to_json(orient='table')