首页 > 解决方案 > 自指字典理解

问题描述

最近,我在回答一个问题。代码按预期工作。但我想看看我是否可以实现我很少使用的字典理解。首先,让我解释一下这个问题

OP 有一个示例列表,例如M1 = [['a', 14], ['a',7], ['a',16],['b',3],['b',15],['c',22],['c',1],['c',5]]. 他们想要一个类似的输出。[['a',14,7,16],['b',3,15],['c',22,1,5]]. 有道理,所以我创建了一个答案。


原始代码

x = [['a', 14,15], ['a',7], ['a',16],['b',3],['b',15],['c',22],['c',1],['c',5]]
dictX = {}
for lsts in x:
    if lsts[0] in dictX.keys():dictX[lsts[0]].extend(lsts[1:])
    else:dictX[lsts[0]] = lsts[1:]  

输出

{'a': [14, 15, 7, 16], 'b': [3, 15], 'c': [22, 1, 5]}

我去

x = [['a', 14,15], ['a',7], ['a',16],['b',3],['b',15],['c',22],['c',1],['c',5]]
dictX = {}
dictX ={(dictX[lsts[0]].extend(lsts[1:]) if lsts[0] in dictX.keys() else dictX[lsts[0]]): lsts[1:]  for lsts in x}

错误

Traceback(最近一次调用最后):文件“/Users/aspera/Documents/Python/Py_Programs/data/timeComplexity/test.py”,第 3 行,在 dictX ={(dictX[lsts[0]]].extend(lsts[ 1:]) if lsts[0] in dictX.keys() else dictX[lsts[0]]): lsts[1:] for lsts in x} File "/Users/aspera/Documents/Python/Py_Programs/data/ timeComplexity/test.py",第 3 行,在 dictX ={(dictX[lsts[0]].extend(lsts[1:]) if lsts[0] in dictX.keys() else dictX[lsts[0]] ): lsts[1:] for lsts in x} KeyError: 'a'

我对此的看法在很多方面似乎都是错误的。我将此用作参考(已接受答案的最高评论)

{(a if condition else b): value for key, value in dict.items()}

有什么办法可以把它变成听写理解。我想要一个示例,它与我提供的参考和我在原始代码中使用的逻辑一致

标签: pythondictionary-comprehension

解决方案


由于嵌套循环,速度一点也不快,但它是可行的。在 dict 理解中使用列表理解。

seq = [['a', 14,15], ['a',7], ['a',16],['b',3],['b',15],['c',22],['c',1],['c',5]]
res = {i[0]:[k for j in seq if j[0] == i[0] for k in j[1:]] for i in seq}
print(res)

输出

{'a': [14, 15, 7, 16], 'b': [3, 15], 'c': [22, 1, 5]}

PS:我意识到这个问题与在 Python 中进行列表/字典理解时是否可以访问当前对象有关?,如果有人认为这是一个骗子,请务必将其标记为这样,我不确定,所以我将其保留。


推荐阅读