从字典键中定义python中的变量?

时间:2016-11-24 13:23:18

标签: python dictionary

我正在努力理解列表与词典以及每种词典的最佳用途以及如何处理数据,因为我正在努力学习。

例如,我在CSV文件中包含以下数据:

device,parent,fexprefix
2248_1,5548_1,Eth101/1/
2248_2,5548_2,Eth102/1/
2248_3,5548_3,Eth103/1/

我通过执行以下操作创建了一个字典:

import csv
reader = csv.DictReader(open('fexmap2.csv'))
fexdata = {}
for row in reader:
    for column, value in row.iteritems():
        fexdata.setdefault(column, []).append(value)

现在我可以按如下方式打印出我的字典:

{'device': ['2248_1', '2248_2', '2248_3'], 'fexprefix': ['Eth101/1/', 'Eth102/1/', 'Eth103/1/'], 'parent': ['5548_1', '5548_2', '5548_3']}

我可以看到我的钥匙:

>>>fexdata.keys()
['device', 'fexprefix', 'parent']

到目前为止,我想这么好。

但现在我需要对这些数据进行查找以获得新的变量(希望这是正确的术语)。

例如,我将解析一些JSON数据,我将在其中了解设备 " 2248_1"

由此,我需要在字典中查找它的父级是什么,以创建我可以开始在脚本中使用的变量。

让我们说当我从JSON获得 " 2248_1" 时,它被定义为:

destdevice = 2248_1

所以现在我想用外行的话说出这样的话:

if destdevice is found in fexdata['device']
then deviceparent = fexdata['parent'] of fexdata['device']

此时,deviceparent = 5548_1

3 个答案:

答案 0 :(得分:2)

如果要将设备用作密钥,请将其设为字典的键:

fexdata = {}
for row in reader:
    fexdata[row['device']] = row

然后,您可以直接获取ID为2248_1的设备的parentid:

destdevice = '2248_1'
deviceparent = fexdata[destdevice]['parent']

答案 1 :(得分:1)

使用您定义的数据结构,您必须检查项目是否在字典中的列表中,获取项目的索引并从父列表中返回另一个项目。像这样:

UIStatusBarAnimationNone

如果您不必添加没有父项的设备,这当然会中断,因为您的数据结构依赖于设备的索引与父项的索引相同而且从不存在重复的设备(具有有不同父母的非独特名字。

使用数据集的示例:

if destdevice in fexdata['device']:
    parentindex = fexdata['device'].index(destdevice)
    deviceparent = fexdata['parent'][parentindex]

答案 2 :(得分:0)

使用回复中的所有信息指出我的第一个错误是我处理数据的方式。我真的需要根据'设备'制作一个密钥。

因为这是所有其他查找真正依赖的。

所以我做了以下事情:

import csv
reader = csv.DictReader(open('fexmap2.csv'))
fexdata = {}
for row in reader:
    fexdata[row['device']] = row

这反过来给了我这个词:

{'2248_3': {'device': '2248_3', 'fexprefix': 'Eth103/1/', 'parent': '5548_3'}, '2248_2': {'device': '2248_2', 'fexprefix': 'Eth102/1/', 'parent': '5548_2'}, '2248_1': {'device': '2248_1', 'fexprefix': 'Eth101/1/', 'parent': '5548_1'}}

然后我可以根据设备找到我需要的信息:

destdevice = '2248_1'
deviceparent = fexdata[destdevice]['parent']
fexprefix = fexdata[destdevice]['fexprefix']

print deviceparent
5548_1
print fexprefix
Eth101/1/

在这一点上,这似乎更符合我的需要和希望实现的目标。现在我将看看我是否会在以后的脚本中遇到任何问题。