0

我有一个 dict[keyA][key1] 形式的字典,其中 'key1' 是一个列表字典。即,keyA 是列表字典的字典。下面是如何创建字典的示例。

dict = { 'keyA': { 'keyA1': ['L1','L2',...], 'keyA2': ['L','L',...], ... },
         'keyB': { 'keyB1': ['L1','L2',...], 'key...': ['L','L',..], ...}
         }

我需要将列表的值连接在一起,并希望使用以下构造来做到这一点:

newStr = ' A B C '.join(val for val in (dict[keyA][k] for k in dict[keyA]))

这将失败,并显示 val 是“列表”与字符串的错误。

当我通过 2 for 循环解析 val 时,我会得到一个字符串列表,正如我期望上面提供的那样。

适用于外部字典中的一个条目并打印字符串列表的简单示例

for k in dict[keyA]:
    for val in dict[keyA][k]:
        print(val)

不起作用并打印“列表”的示例:

for val in (dict[keyA][k] for k in dict[keyA]): print(val)

上述失败测试的输出(注意输出中的括号)。如果我“输入”这个值,则表明该值确实是一个列表:['some text', 'some more text', ....]

上面的工作嵌套“for”循环在单独的行上生成上述文本,没有预期的括号,其输出应该在连接中工作以提供所需的结果....

谁能解释我在这里缺少什么?

4

1 回答 1

1

您对“嵌套”理解的语法并不完全正确。

如果你分离出第二部分,你会看到是什么绊倒了它:

>>> [_dict['keyA'][k] for k in _dict['keyA']]
[['L1', 'L2', 'L3'], ['Q1', 'Q2', 'Q3']]

嵌套理解的顺序不直观(IMO),并且按照循环降序从左到右读取,而不是我认为大多数人最初会假设的展开方式。

无论如何,你只需要调整你的理解:

>>> ' A B C '.join(val for key in _dict['keyA'] for val in _dict['keyA'][key])
'L1 A B C L2 A B C L3 A B C Q1 A B C Q2 A B C Q3'

或使用dict.items

(注意:_这里用作占位符/一次性,因为在这种情况下您实际上不需要“key”循环变量)

>>> ' A B C '.join(val for _, v in _dict['keyA'].items() for val in v)
'L1 A B C L2 A B C L3 A B C Q1 A B C Q2 A B C Q3'

另外,顺便说一句,避免使用python 内置作为变量名,否则您以后将无法在代码中使用该内置。

于 2019-10-22T21:37:08.600 回答