繁体   English   中英

有字典的列表内条件检查

[英]conditional check inside list comprehension with dictionary

我有一个列表列表,看起来像:

l = [['A', 1], ['B', 10],['C', 100]]

然后我有一个字典,其中的键对应于上述列表的第一项。 值是列表(在下面的示例中,每个列表只有一个值,但实际上我有更多。但是为了简洁起见,我只显示一个值):

d = {'A': [2], 'B': [5], 'C': [110] }

我现在想基于以下逻辑创建一个新列表:对于第一个列表的每个第一个列表项 (例如ABC ),我想查看一下,如果字典中的对应值较小。 如果字典中的值较小,请在结果列表中使用该值。 如果该值小,则使用相同的值。

因此,输出应如下所示:

[['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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM