2011-01-22 36 views
1

在python 3中使用operator.setitem時出現問題。python 3 operator.setitem問題

當我使用下面的代碼並在python 3.1中運行它時。

people=(('fred','sam','jane','betty'),(1,2,3,4)) 
p_dict = {} 
map(operator.setitem, [p_dict]*len(people[0]), people[0],people[1]) 
print (p_dict) 

>>> {} 

這只是打印出一個空字典{}。

但我使用相同的代碼在Python 2.6中運行。 它打印出{'jane':3,'betty':4,'sam':2,'fred':1}。 這是我想要的結果。

那麼,任何人都可以告訴我,當我在Python 3中運行此代碼時有什麼問題? 在此先感謝。

+1

花了我幾分鐘時間才弄清楚代碼做了什麼,我需要一個Python控制檯。你今天得到了大多數混淆代碼的代價。請記住,這是一件壞事。 – 2011-09-28 11:00:37

回答

3

這是一個非常unpythonesque的方式來做到這一點。這是更好(更高效):

people = (('fred','sam','jane','betty'), (1,2,3,4)) 
p_dict = dict(zip(*people)) 

適用於2.x和3.x.

+0

您的意思是unpythonic? – Jeb 2011-07-09 03:04:27

1

在Python 3中,map的結果很懶,這在調試可以在舊版本的Python中完美工作的東西時會讓您頭疼。換句話說,它是一個生成器,所以你必須使用它來設置字典中的項目。

你還是一個做到這一點的循環在這種情況下:

people=(('fred','sam','jane','betty'),(1,2,3,4)) 
p_dict = {} 
for key, value in zip(*people): 
    p_dict[key] = value 
# Now p_dict is {'jane': 3, 'betty': 4, 'sam': 2, 'fred': 1} 

或用一個簡單的字典構造:dict(zip(*people))

2

問題是map()從不「執行」。在Python 3中,map只是返回一個迭代器 - 各個元素只在需要時才計算。要解決這一點,你可以寫

list(map(operator.setitem, [p_dict]*len(people[0]), people[0],people[1])) 

然而,我與其他人一樣,你不應該擺在首位使用地圖同意 - 因爲你不真正需要產生的地圖應用。

+1

比`list`更好地使用`any` - 它不會累積值,並且會耗盡迭代器,因爲`setitem`總是返回`None`。 – agf 2012-05-13 05:23:39