2012-11-08 147 views
3

我有這樣一個字典:轉換字典值轉換爲一組,同時保留字典

(100002:「蘋果」,100004:「香蕉」,100005:「胡蘿蔔」)

我想使我的字典爲鍵(如它現在所做的那樣)輸入值,但是爲值設置了值(而不是現在的字符串)。我的目標是能夠從一個.csv文件中讀取關鍵字的一列(一個是物品ID號的int),然後是大小,形狀和顏色等列。我想將這些信息添加到我的字典中,以便只添加字典中已有字符的信息。

我的目標字典可能是這樣的:

(100002: set(['APPLE','MEDIUM','ROUND','RED']), 100004: set(['Banana','MEDIUM','LONG','YELLOW']), 100005: set(['CARROT','MEDIUM','LONG','ORANGE']) 

我只是鍵+字符串的字典的項目名稱開始,我想這樣的代碼在從.csv文件中讀取額外的信息:

infile = open('FileWithTheData.csv', 'r') 
for line in infile.readlines(): 
    spl_line = line.split(',') 
    if int(spl_line[0]) in MyDict.keys(): 
     MyDict[int(spl_line[0])].update(spl_line[1:]) 

不幸的是,這個錯誤說出AttributeError: 'str' object has no attribute 'update'。我試圖將字典的值更改爲集,以便我可以更新它們,例如:(100002: set(['A','P','L','E']), 100004: set(['B','A','N']), 100005: set(['C','A','R','O','T'])) 我想將值轉換爲一個集,以便當前值的字符串將作爲第一個字符串設置而不是將字符串分解爲字母並製作一組這些字母。

我也嘗試了通過將兩個列表壓縮在一起來創建字典,但似乎沒有任何區別,從而使值成爲一組。像這樣的 MyDict = dict(listofkeys,set(listofnames))) 仍然使整個listofnames列表成爲一個集合,但它沒有實現我的目標,即將MyDict中的每個值變成一個集合, listofnames作爲集合中的第一個字符串。

如何將MyDict中的值設置爲一個集合,以便我可以將其他字符串添加到該集合中,而無需將當前字典中的值轉換爲一組單個字母?

編輯: 我目前通過使用一個函數來生成項目標識符(這是鍵)的列表和另一個函數查找這些項目標識符以生成相應項目名稱的列表(使用兩列.csv文件作爲數據源),然後將它們結合在一起。

答案: 使用這裏的建議我想出了這個解決方案。我發現set())。update的部分可以很容易地更改爲list())。append可以產生一個列表而不是一個集合(這樣就可以保留這個順序)。我還發現它更容易更新。 csv數據輸入文件,方法是將包含名稱的列添加到FileWithTheData.csv中,這樣我就不必亂用dict,將值轉換爲集合,然後添加更多數據。我給這部分代碼現在看起來像這樣:

MyDict = {} 
infile = open('FileWithTheData.csv', 'r') 
for line in infile.readlines(): 
    spl_line = line.split(',') 
    if int(spl_line[0]) in itemidlist: #note that this is the list I was formerly zipping together with a corresponding list of names to make my dict 
     MyDict.setdefault(int(spl_line[0]), list()).append(spl_line[1:]) 
print MyDict 
+0

請說明如何創建MyDict變量。 –

回答

4

你的錯誤是因爲本來你MyDict變量映射到一個字符串的整數。當您嘗試更新它時,如果它是一個字符串,則將它視爲set,

您可以使用此一defaultdict

combined_dict = defaultdict(set) 

# first add all the values from MyDict 
for key, value in MyDict.iteritems(): 
    combined_dict[int(key)].add(value) 

# then add the values from the file 
infile = open('FileWithTheData.csv', 'r') 
for line in infile.readlines(): 
    spl_line = line.split(',') 
    combined_dict[int(sp_line[0])].update(spl_line[1:]) 
+0

我得到: line_id,line_values = line.split(','1) ^ SyntaxError:無效的語法 – Qanthelas

+0

對不起,我修好了。 –

+0

您可能意指'在MyDict.items()'或'MyDict.iteritems()'中。 – DSM

2

你的問題是你如何初始化MyDict,嘗試將其更改爲以下:

MyDict = dict(zip(listofkeys, [set([name]) for name in listofnames])) 

這裏的一個簡單的例子區別:

>>> listofkeys = [100002, 100004, 100005] 
>>> listofnames = ['APPLE', 'BANANA', 'CARROT'] 
>>> dict(zip(listofkeys, set(listofnames))) 
{100002: 'CARROT', 100004: 'APPLE', 100005: 'BANANA'} 
>>> dict(zip(listofkeys, [set([name]) for name in listofnames])) 
{100002: set(['APPLE']), 100004: set(['BANANA']), 100005: set(['CARROT'])} 

set(listofnames)只是將你的列表變成一個集合,唯一可能的影響是重新排列上面的值。你實際上想要把你的列表中的每個字符串值,並將其轉換爲一個元素集,這是列表理解所做的。

做出此更改後,您的當前代碼應該可以正常工作,但您可以直接在字典上執行包含檢查而不是明確檢查密鑰(key in MyDictkey in MyDict.keys()相同)。

+0

很高興知道以供將來參考,但現在我看到Nathan Villaescusa提供的一種方法,不必擔心將值轉換爲單個字符串集合,我想我會使用他的方法。不過,這確實回答了我如何做這個轉換的問題,如果我決定我需要:) – Qanthelas