【问题标题】:When the key is a tuple in dictionary in Python当键是Python字典中的元组时
【发布时间】:2014-03-17 00:04:21
【问题描述】:

我很难理解这一点。我有一本字典,其中的键是一个由两个字符串组成的元组。我想把这个元组的第一个字符串小写,可以吗?

【问题讨论】:

  • 一旦创建元组就无法更改它,因此您必须在创建元组之前进行检查。
  • @user2795095,你想修复旧字典中的键是否是一个约束,因为你似乎暗示了这一点。

标签: python dictionary tuples lowercase


【解决方案1】:

您可以使用字典推导来构建一个新的字典,并应用您的更改:

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

【讨论】:

  • "modified" 可能是错误的词。这是分配给原始名称的新dict。如果本地名称是唯一的参考,那应该没问题。
  • @StevenRumbalski:这里的“修改”是指对其应用纯函数(因此仍保留旧值)。同意它与突变的含义相冲突。您认为哪个词更合适?
  • 我只会使用“新”。
【解决方案2】:

由于元组是不可变的,您需要删除旧的并创建一个新的。这适用于 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() 返回一个列表副本,因此不需要将其传递给 list,但我选择保留它是为了与 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}

【讨论】:

  • Python 2 说,“在字典中添加或删除条目时使用 iteritems() 可能会引发 RuntimeError 或无法遍历所有条目。” Python 3 对items() 说同样的话,“在字典中添加或删除条目时迭代视图可能会引发RuntimeError 或无法遍历所有条目。”
  • 嗨,@SteveJessop,很好,我测试了它,它在这个用例中运行良好,但我不想让人们误入其他用例,所以我编辑了它你建议的安全方向。
【解决方案3】:

在将其放入元组之前,您必须将字符串更改为小写。元组在创建后是只读的。

【讨论】:

  • 你总是可以创建一个新的字典来代表你想要的变化
  • Okei,谢谢你的回答。我正在从 brown 导入一个以元组形式出现的 word-tagg 语料库,所以在将其放入字典之前我不知道如何更改它...
  • 虽然,这与元组是不可变的并没有太大关系——问题实际上是 string 是不可变的。 (在tuple 中改变一个对象就可以了)。
  • 如果你已经得到了填充字典,我想你可以遍历每个键/值,使用字符串的小写版本创建一个新键,插入具有相同值的新键,然后删除原来的对。
  • @mgilson 即使字符串是可变的,改变它也会破坏哈希表的不变量。幸好 python 不允许你使用可变对象作为键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2020-05-18
  • 2022-12-24
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多