2016-11-24 24 views
4

我對列表與字典的理解以及每種方式的最佳用法以及如何嘗試學習時如何處理數據一直在掙扎。從字典鍵中定義python中的變量?

舉例來說,我有一個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」

因此,我需要查看它在字典中的父項是什麼,以創建一個我可以在腳本中開始使用的變量。

讓我得到的說,「2248_1」從JSON它被定義爲:

destdevice = 2248_1 

所以現在我想說通俗地說是這樣的:

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

在哪一點,deviceparent = 5548_1

+1

考慮使用替代結構爲您的字典。使'device' id成爲關鍵字,並將值設爲'(parent,fexprefix)'的元組。這樣你就可以快速獲得任何「設備」的'parent'和'fexprefix'。 –

+0

我認爲你正在做的事情,很可能這正是我需要做的。你會碰巧有一個如何實現這個目標的例子嗎? – ddevalco

+0

好的使用你所說的以及其他來自其他人的信息,這對我的需求更好,我相信。 – ddevalco

回答

2

如果該設備是用來作爲重點,使你的字典的關鍵:

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

然後,您可以直接拿到的parentId的設備ID爲2248_1:

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

用你定義的數據結構你有檢查該項目是否在字典中的列表中,獲取項目的索引並從父項目列表中返回另一項目。就像這樣:

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

當然,這打破了,如果你有添加設備,而無需父母吧,因爲你的數據結構依賴於設備是一樣的家長和該指數的指數永遠不會有與父母不同的重複設備(具有非唯一名稱)。使用

例如您的數據集:

>>> fexdata = {'device': ['2248_1', '2248_2', '2248_3'], 'fexprefix': ['Eth101/1/', 'Eth102/1/', 'Eth103/1/'], 'parent': ['5548_1', '5548_2', '5548_3']} 
>>> destdevice = '2248_1' 
>>> if destdevice in fexdata['device']: 
...  parentindex = fexdata['device'].index(destdevice) 
...  deviceparent = fexdata['parent'][parentindex] 
... 
>>> deviceparent 
'5548_1' 
+0

我很欣賞這種見解。我瞭解數據的完整性沒有重複或空白字段的擔憂。這是一個不會成爲問題的情況,除非意外。一個問題,但... fexdata ['設備']將永遠不會有另一個相同的名稱。但是fexdata ['parent']對於不同的fexdata ['device']可以是同一個名字嗎?這不應該從這個角度來破壞事物嗎? – ddevalco

+0

只要fexdata ['parent] [i]具有相同的索引(它與fexdata ['device'] [i]同時添加,就會產生正確的答案。這裏的缺點是fexdata [ 'parent']會大於neccessery,但它仍然有效,即在fexdata ['parent']中重複使用並不重要或破壞完整性。 –

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/ 

在這一點上,這絕對看起來更符合我需要和希望完成的事情。現在我會看看我是否稍後在腳本中遇到任何陷阱。