使用字典

时间:2017-08-05 09:31:25

标签: python list list-comprehension

我有一个列表如下:

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:不可用类型:&#39; list&#39;

修改

在做了一些研究之后,我看到人们说问题是,我使用列表作为我的词典中的关键。我绝对不打算这样做。在上面显示的示例数据中,您看到我的意图是在字典中使用字符串作为键。我刚刚用d.keys()检查了所有密钥,并且我的密钥中只有字符串。所以这似乎不是问题所在。

3 个答案:

答案 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)