Python TypeError:提取键时字符串索引必须是整数

Python TypeError:提取键时字符串索引必须是整数,python,Python,字典如下 my = { "1": { "first": 'A,B', "column": "value", "test":"test", "output": "Out1", "second": "Cost", "Out2": &

字典如下

my = {
  "1": {
    "first": 'A,B',
    "column": "value",
    "test":"test",
    "output": "Out1",
    "second": "Cost",
    "Out2": "Rev"
  },
  "2": {
    "first": 'None',
    "column": "value",
    "test":"test",
    "output": "Out2",
    "Out2": "Rev"
  }
}
{k:{l:l[i] for i in ['first','test'] for l,m in v.items()} for k,v in my.items()}
我试过的代码如下

my = {
  "1": {
    "first": 'A,B',
    "column": "value",
    "test":"test",
    "output": "Out1",
    "second": "Cost",
    "Out2": "Rev"
  },
  "2": {
    "first": 'None',
    "column": "value",
    "test":"test",
    "output": "Out2",
    "Out2": "Rev"
  }
}
{k:{l:l[i] for i in ['first','test'] for l,m in v.items()} for k,v in my.items()}
我试图只提取两个
['first','test']
键,但
['first','test']
的更改也不存在

我越来越

TypeError:字符串索引必须是整数。代码有什么问题


这两种方法都可以奏效:

print({k: {"first": v["first"], "test": v["test"]} for k, v in my.items()})
print({k: {i: v[i] for i in ['first','test']} for k, v in my.items()})
这是意料之中的事

print({x: {i: y[i] for i in ['first', 'test']} for x, y in my.items()})
输出

{'1': {'first': 'A,B', 'test': 'test'}, '2': {'first': 'None', 'test': 'test'}}

让我们使用其中一个子词典来了解这里出了什么问题

  "1": {
    "first": 'A,B',
    "column": "value",
    "test":"test",
    "output": "Out1",
    "second": "Cost",
    "Out2": "Rev"
  },
代码中的变量
k
将是键
“1”
,值
v
将是子字典

然后,当您执行
“l”
“l”
实际上是字典键,它们是字符串,例如
“first”
“test”
。然后,当您尝试执行
l:l[i]
时,实际上您正在尝试索引字符串
“first”
,并且您没有使用整数值来索引字符串,而是在传递字符串值-因此您正在执行
“first”[“first”]

这就是为什么您会看到带有消息“字符串索引必须是整数”的
TypeError

如果你想要一个聪明的一行,这应该是可行的

{
   key: {sub_key:sub_dict[sub_key] for sub_key in ["first", "test"]}
   for key, sub_dict in my.items()
}
就我个人而言,我会写信

selected_dict = dict()
for key, value in my.items():
    for sub_key in ["first", "test"]:
        selected_dict[sub_key] = value[sub_key]

你的预期产量是多少?那一行太聪明了,我不喜欢。这一点都不容易理解。它也被破坏了,显然你可以应用它,这将比在整个dict上迭代稍微快一点。