2014-02-17 14 views
4

我有麻煩理解這一點。我有一本字典,其中的關鍵字是一個由兩個字符串組成的元組。我想小寫這個元組中的第一個字符串,這可能嗎?當鍵是Python中的字典中的元組時

+2

一旦你創建的元組,你可以」不要改變它,所以你在創建元組之前先檢查一下。 –

+0

@ user2795095,是你想修復舊字典中的鍵的一個約束,因爲你似乎暗示了這一點。 –

回答

3

由於元組是不可變的,所以您需要刪除舊元件並創建一個新元件。這部作品在Python 2和3,並保持原來的字典:

>>> d = {('Foo', 0): 0, ('Bar', 0): 0} 
>>> for (k, j), v in list(d.items()): # list key-value pairs for safe iteration 
...  del d[k,j] # remove the old key (and value) 
...  d[(k.lower(), j)] = v # set the new key-value pair 
... 
>>> d 
{('foo', 0): 0, ('bar', 0): 0} 

注意,在Python 2,dict.items()返回一個列表複製,所以它傳遞給列表是不必要的,但是我選擇了讓它與Python 3完全兼容。

您還可以使用發送到dict的生成器語句,並讓舊字典得到垃圾回收。這也是與Python 2.7,兼容2.6和3

>>> d = {('Foo', 0): 0, ('Bar', 0): 0} 
>>> d = dict(((k.lower(), j), v) for (k, j), v in d.items()) 
>>> d 
{('bar', 0): 0, ('foo', 0): 0} 
+0

Python 2說:「在字典中添加或刪除條目時使用iteritems()可能會引發RuntimeError或無法迭代所有條目。」 Python 3對'items()'表示同樣的效果,「在字典中添加或刪除條目時迭代視圖可能會引發'RuntimeError'或無法迭代所有條目。」 –

+0

嗨,@SteveJessop,很好的接受,我測試了它,並且它在這種用例中工作正常,但我不想讓人們誤導其他用例,所以我按照您的建議按照安全的方向編輯它。 –

+0

非常感謝你,這工作完美! – user2795095

0

在將字符串放入元組之前,您必須將字符串更改爲小寫字母。元組在創建後是隻讀的。

+0

你可以隨時創建一個代表你想要更改的新字典 –

+0

Okei,謝謝你的回答。我正在導入一個來自元組的來自brown的word-tagg語料庫,所以我沒有看到在把它放到字典中之前我怎麼能改變它... – user2795095

+0

雖然,這與真的沒有多大關係元組是不可變的 - 問題是* string *是不可變的。 (改變'tuple'中的對象工作得很好)。 – mgilson

0

不幸的是,你必須創建一個新的密鑰。類似這樣的:

>>> key, value = ('SPAM', 'eggs'), 'potato' 
>>> d = {key: value} 
>>> print d 
{('SPAM', 'eggs'): 'potato'} 
>>> new_key = (key[0].lower(),) + key[1:] 
>>> d[new_key] = d.pop(key) 
>>> print d 
{('spam', 'eggs'): 'potato'} 
4

您可以使用字典解析來建立一個新的字典與應用更改:

d = { (a.lower(), b) : v for (a,b), v in d.items() } 
+0

「修改」可能是錯誤的詞。這是一個新的'dict'分配給原來的名字。如果本地名稱是唯一的參考,那應該沒問題。 –

+0

@StevenRumbalski:通過「修改」這裏我的意思是應用一個純函數(因此舊值仍然保留)。同意它與突變的意義相沖突。你認爲什麼是更好的術語? –

+0

我只是使用「新」。 –

相關問題