2014-02-17 16 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

我只是使用“新”。 –

相关问题