我有一个列表如下:
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:不可用类型:&#39; list&#39;
修改
在做了一些研究之后,我看到人们说问题是,我使用列表作为我的词典中的关键。我绝对不打算这样做。在上面显示的示例数据中,您看到我的意图是在字典中使用字符串作为键。我刚刚用d.keys()
检查了所有密钥,并且我的密钥中只有字符串。所以这似乎不是问题所在。
答案 0 :(得分:2)
你可以试试这个,
my $s = "abc";
with $s.index("a") { say "Found a at $_" }
orwith $s.index("b") { say "Found b at $_" }
orwith $s.index("c") { say "Found c at $_" }
else { say "Didn't find a, b or c" }
现在将转移到您的错误不可用类型列表,
您尝试将整个列表作为dic键传递而不是字符串..您的错误,
>>> 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]]
>>>
将其更改为 if d[i][0]
所以就像这样,
if d[i[0]] < i[1]
答案 1 :(得分:0)
您可以使用内置的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]
答案 2 :(得分:0)
简单列表理解:
>>> [[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]]
>>>
输出:
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)