【问题标题】:Executing join of dictionary of list items执行列表项字典的连接
【发布时间】:2019-10-22 21:10:31
【问题描述】:

我有一个 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)

上面测试失败的输出(注意输出中的括号)。如果我“键入”此值,则表明该值确实是一个列表: ['一些文字','一些更多文字',....]

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

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

【问题讨论】:

    标签: python list dictionary join


    【解决方案1】:

    “嵌套”推导式的语法不太正确。

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

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

    嵌套理解的顺序 isn't intuitive (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 built-ins 作为变量名,否则您以后将无法在代码中使用该内置函数。

    【讨论】:

    • 完美运行,谢谢。你是对的,我使用嵌套的“for”引用“在错误的方向”工作。我在考虑从外到内循环与向下传递代码流的流...但是,现在就它们如何单独“嵌套”与以这种方式“内联”而言是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2021-10-20
    相关资源
    最近更新 更多