Python 如何通过使用相同的键和多个值在列表上迭代来创建字典?

Python 如何通过使用相同的键和多个值在列表上迭代来创建字典?,python,pandas,list,dictionary,dataframe,Python,Pandas,List,Dictionary,Dataframe,我有df命令的输出来检查我的文件系统。我从os.command获得它,然后将它添加到列表中。现在我正在逐行实现,并希望创建一个字典,因为我需要稍后将响应作为json发送 已使用的文件系统大小可用率已安装% /开发/xxxx/yyy 9.8G 3.2G 6.1G 35%/ tmpfs 32G 0 32G 0%/dev/shm /开发/sss 247M 106M 129M 46%/开机 /dev/aaa/ccc 1.5G 205M 1.2G 15%/家庭 /dev/bbb/ddd 2.2G 152M

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

已使用的文件系统大小可用率已安装%
/开发/xxxx/yyy 9.8G 3.2G 6.1G 35%/
tmpfs 32G 0 32G 0%/dev/shm
/开发/sss 247M 106M 129M 46%/开机
/dev/aaa/ccc 1.5G 205M 1.2G 15%/家庭
/dev/bbb/ddd 2.2G 152M 2.0G 8%/opt
我想要的是:

{
文件系统:/dev/xxxx/yyy
{ 
尺码:9.8克
使用:
效用:
使用%:
安装在:
}
文件系统:tmpfs
{ 
尺寸:
使用:
效用:
使用%:
安装在:
}
文件系统:/dev/sss
{ 
尺寸:
使用:
效用:
使用%:
安装在:
}
}
我现在的代码是:

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

我想知道这是否可行,因为我有相同的键和不同的值,如果是这样,在python中实现这一点的最佳方法是什么?

将非常接近这一点:

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}

也许你可以使用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')

要回答您的问题,不,同一本词典中不能有同名的不同键。但是,如果您按
文件系统
对所有内容进行分组,您可以让字典的键成为
文件系统
的值本身,在这种情况下,字典将如下所示:

{ '/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:]))

您的输出不是一个有效的Python文本,不清楚您想要什么。它在一次尝试中就像一个符咒。是的,使用文件系统值作为键是有意义的。谢谢你的解决方案。马上接受。这里有一个小小的改变,值[1:6]而不是值[1:5]来获得“挂载”值。值[1:5]将给出直到值[4],而不是第5个。但是,值[1:]也可以。谢谢:)