2016-09-14 74 views
-3

我使用的是不支持減去字典的python的老版本。不支持的操作數類型 - 列表和列表

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 

基本上我的代碼如下所示:

for key in d1.keys(): 
     if key in d2: 
      d3[key]=d1[key]-d2[key] 

輸出應該像

d2={'ab': ['2'], 'hij': ['600']} 

它返回不支持的操作數類型 - :列表和列表。 如何解決這個

+0

請發佈d1和d2的內容​​。 – karlosss

+3

你想從另一個列表中減去一個列表。你期望得到什麼結果? – mgilson

+0

另一個包含鍵值差異的列表 – identical123456

回答

0

從列表中取得第一個值,並將其轉換爲int秒。

d1 = {'ab': ['3'], 'hij': ['1200']} 
d2 = {'ab': ['1'], 'hij': ['600']} 
d3 = {} 

for key in d1.keys(): 
    if key in d2: 
     d3[key] = int(d1[key][0]) - int(d2[key][0]) 

print d3 

輸出:

{'hij': 600, 'ab': 2} 

支持花車,你需要轉換爲float。如果你想有4位數的精度,那麼你可以使用round函數。

d1 = {'ab': ['3.2462353'], 'hij': ['1200.223353']} 
d2 = {'ab': ['1.346733'], 'hij': ['600.252341']} 
d3 = {} 

for key in d1.keys(): 
    if key in d2: 
     num1 = float(d1[key][0]) 
     d3[key] = round(float(d1[key][0]) - float(d2[key][0]), 4) 

print d3 

輸出:

{'hij': 599.971, 'ab': 1.8995} 
+0

不得不使用float,因爲我也有一些非整數。無論如何,只返回幅度和只有4位有效數字,而不是我目前正在獲取的很多。此外,我不認爲它的工作,因爲我得到所有鍵 – identical123456

+0

相同的差異值更新爲支持4位精度浮點數。是的,它的工作。檢查我輸入的輸出。這是正確的。 – Jarvis

+0

不確定你的意思是相同的區別。 – Jarvis

0

任何想法請嘗試以下操作:

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 
d3={} 
for key in d1.keys(): 
    if key in d2: 
     d3[key] = [str(int(d1[key][i]) - int(d2[key][i])) for i in xrange(len(d1[key]))] 
print d3 
+0

它說無效的語法 – identical123456

+0

更正。現在就試試。 – galah92

+0

不支持的操作數類型爲 - :str和str – identical123456

0

你不能減去名單,像這樣。

你也可以使用一個字典理解中 n和再zip的名單,這樣你就可以減掉自己的內容:

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 

d3 = {k: ['{}'.format(int(i) - int(j)) for i, j in zip(d1[k], d2[k])] for k in d1} 
print(d3) 
# {'hij': ['600'], 'ab': ['2']} 

注意這裏使用字符串格式化鑄造到int,然後返回到字符串的項目。如果您的數據實際上是作爲整數存儲在首位,那麼可能會更好。

+0

說我無效的語法 – identical123456

+0

我想相信你沒有複製'>>>' –

0

你有沒有試過看d1 [key]和d2 [key]來了解錯誤的含義?那麼如果沒有,你應該有,這是調試代碼的第一步:查找失敗的位置以及失敗的原因。

因此,您的問題的解釋是以下d1 ['ab']不是一個數字,它是一個列表,該列表是更精確的['3']。所以寫d1['ab'] - d2['ab']轉化爲['3'] - ['1'],這將是相當於做list() - list()和錯誤狀態是沒有辦法。減去兩個列表,根本就沒有定義的操作。所以,你需要的是採取什麼是列表,而不是名單本身,而是被那些列表裏面小心你只有沒有實際的數字,所以你必須將字符串轉換爲數字,只有這樣,你會能夠做預期的子事務。

但這一切是相當繁瑣和我假設的錯誤是,你沒有完全以undersand dictionnaries的語法,當你寫的代碼。您不必將數字作爲字符串放在列表中並將其放入字典中,您可以直接將該數字作爲字符輸入:d1={'ab': 3, 'hij': 1200}是完全有效的Python代碼。然後當您撥打d1['ab']時,您可以直接獲得您期望的號碼。

+0

謝謝你的解釋。我用「d1.setdefault(name,[])。append(number)」來獲得字典。將它改爲append(float(number))應該可以做到這一點 – identical123456

相關問題