[英]conditional check inside list comprehension with dictionary
我有一个列表列表,看起来像:
l = [['A', 1], ['B', 10],['C', 100]]
然后我有一个字典,其中的键对应于上述列表的第一项。 值是列表(在下面的示例中,每个列表只有一个值,但实际上我有更多。但是为了简洁起见,我只显示一个值):
d = {'A': [2], 'B': [5], 'C': [110] }
我现在想基于以下逻辑创建一个新列表:对于第一个列表的每个第一个列表项 (例如A
, B
和C
),我想查看一下,如果字典中的对应值较小。 如果字典中的值较小,请在结果列表中使用该值。 如果该值不小,则使用相同的值。
因此,输出应如下所示:
[['A', 1], ['B', 5],['C', 100]]
我尝试了以下列表理解,但出现错误:
[[i[0], d[i][0] if d[i][0] < i[1] else i[0],i[1]] for i in l])
我收到此错误:
TypeError:无法散列的类型:“列表”
编辑:
经过研究后,我发现人们会说问题出在,我使用列表作为字典中的键。 绝对不是我打算这样做。 在上面显示的示例数据中,您看到我的意图是将字符串用作字典中的键。 我只是用d.keys()
检查了所有键, d.keys()
键中只有字符串。 因此,这似乎不是问题。
你可以试试看
>>> d = {'A': [2], 'B': [5], 'C': [110] }
>>> l = [['A', 1], ['B', 10],['C', 100]]
>>> [i if i[1] < d[i[0]][0] else [i[0],d[i[0]][0]] for i in l]
[['A', 1], ['B', 5], ['C', 100]]
>>>
现在将进入您的错误,“ 不可哈希类型”列表 ,
您尝试将整个列表作为dic键而不是字符串传递。。
if d[i][0]
将其更改为 if d[i[0]] < i[1]
所以会是这样,
>>> [[i[0], d[i][0] if d[i[0]] < i[1] else i[0],i[1]] for i in l]
[['A', 'A', 1], ['B', 'B', 10], ['C', 'C', 100]]
>>>
您可以使用内置的min
函数并使用列表推导来执行此操作。
[这将找到字典中值的最小值以及原始列表]:
[[x[0], min(min(d[x[0]]), x[1])] for x in ls]
另外,一个使用for循环的简单解决方案:
for i in range(len(ls)):
ls[i][1] = min(min(d[ls[i][0]]), ls[i][1])
为此,仅在原始列表值和字典列表的第一个值之间计算最小值,请执行以下操作:
[[x[0], min(d[x[0]][0], x[1])] for x in ls]
简单的列表理解:
l = [['A', 1], ['B', 10],['C', 100]]
d = {'A': [2], 'B': [5], 'C': [110] }
result = [[subl[0], d[subl[0]][0]] if d[subl[0]][0] < subl[1] else subl for subl in l]
print(result)
输出:
[['A', 1], ['B', 5], ['C', 100]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.