如何在保留字典顺序的同时重命名键(Python 3.7+)?

时间:2019-12-05 13:15:39

标签: python python-3.x

我有一本字典,其值为:

{"a": 1, "b": 2, "c": 3}

我想将键b重命名为B,而又不会失去其第二位。在Python 3.7及更高版本中,字典保留插入顺序,因此可以指望键的顺序,并可能表示某些含义。我要寻找的最终结果是:

{"a": 1, "B": 2, "c": 3}

显而易见的代码将运行:

>>> dictionary["B"] = dictionary.pop("b")
{'a': 1, 'c': 3, 'B': 2}

但是,这不能保留所需的顺序。

4 个答案:

答案 0 :(得分:4)

foo = {'c': 2, 'b': 4, 'J': 7}
foo = {key if key != 'b' else 'B': value for key, value in foo.items()}
foo
Out[7]: {'c': 2, 'B': 4, 'J': 7}

答案 1 :(得分:1)

#include <stdio.h>

char* howdy(int arg) { printf(">howdy: arg = %d\n", arg); return "howdy"; }
char* goodbye(int arg) { printf(">goodbye: arg = %d\n", arg);  return "goodbye"; }

typedef char* (*Charpfunc)(int arg);

void print(Charpfunc* p, int *arg)
{
  while (*p) {
    puts((*p)(*arg));
    p++;
    arg++;
  }
}

int main()
{
  Charpfunc funcs[] = {
      howdy, goodbye, NULL
  };

  int arg111[] = { 1, 11 };
  int arg222[] = { 2, 22 };
  print(funcs, arg111);
  print(funcs, arg222);
  return 0;
}

您可以在 if 语句

中设置所需的任何值。

答案 2 :(得分:1)

此解决方案就地修改了字典d。如果不关心性能,则可以执行以下操作:

d = {"a": 1, "b": 2, "c": 3}
replacement = {"b": "B"}

for k, v in d.items():
    d[replacement.get(k, k)] = d.pop(k)

print(d)

输出

{'a': 1, 'B': 2, 'c': 3}

请注意,上述解决方案适用于任意数量的要更换的钥匙。

答案 3 :(得分:1)

作为现有答案的一种变体,该变体也可以多次替换,您可以定义另一个字典,该字典显示用该其他键替换的键:

>>> d = {"a": 1, "b": 2, "c": 3}
>>> repl = {"b": "B"}
>>> {repl.get(k, k): d[k] for k in d}
{'a': 1, 'B': 2, 'c': 3}

当然,这仍然会创建一个新字典,而不是更新现有字典,因此需要O(n),但对于需要更新的所有键,它至少只执行一次。