在包含列表列表的字典上操作

时间:2015-07-11 23:33:11

标签: python list dictionary

我试图更新字典中的列表列表,我希望删除列表中的任何列表(在列表列表中),该列表的项目小于我将其与之比较的任何项目。例如,给出下面列表列表的字典..

mydict = {3603172: [
    ['M2-HCg18', 12.00, 12.00, 9.00, '12 x 12 x 9'],
    ['M2-HCg18', 16.00, 14.00, 8.00, '16 x 14 x 8'],
    ['M2-HCg18', 16.00, 14.00, 14.00, '16 x 14 x 14'],
    ['M2-HCg18', 18.00, 18.00, 18.00, '18 x 18 x 18'],
    ['M2-HCg18', 16.00, 10.25, 0.25, 'Bubble Mailer #5 10.5 x 16'],
    ['M2-HCg18', 7.25, 4.75, 1.00, 'Bubble Mailer #4 7.25 x 5'],
    ['M2-HCg18', 9.25, 7.25, 1.00, 'Bubble Mailer DVD 10.25 x 7.25'],
    ['M2-HCg18', 28.00, 14.00, 8.00, '28x14x8'],
    ['M2-HCg18', 28.00, 14.00, 0.25, '28x14x4'],
    ['M2-HCg18', 16.00, 10.25, 0.25, 'Bubble Mailer #5 10.5 x 16'],
    ]}

上面的dict有一个键(3603172),其值是一个列表列表。请注意,列表列表中可能存在重复列表。我想要做的是将任何一个内部列表中的第4项与给定值进行比较,如果列表中的第3项较小,则删除列表。因此,如果我的值为0.5,我想删除索引3处小于0.5的所有内部列表。

我知道我可以使用mydict.itervalues()并对列表列表的值进行操作,然后使用带有0.5的if语句在索引3上运行比较,但我真的不知道干净如果索引3处的值小于0.5,则删除列表的方法。 在上面的示例中,我想删除索引为3(小于0.5)的0.25的所有列表。 什么是一个好方法呢?

3 个答案:

答案 0 :(得分:0)

python列表过滤的概念在以下文章中演示: List filtering: list comprehension vs. lambda + filter

也就是说,您可以遍历密钥,并且对于每个密钥,将其新值设置为使用其中一种提供的方法过滤的旧值。

答案 1 :(得分:0)

使用dict理解。

>>> mydict = {3603172: [
    ['M2-HCg18', 12.00, 12.00, 9.00, '12 x 12 x 9'],
    ['M2-HCg18', 16.00, 14.00, 8.00, '16 x 14 x 8'],
    ['M2-HCg18', 16.00, 14.00, 14.00, '16 x 14 x 14'],
    ['M2-HCg18', 18.00, 18.00, 18.00, '18 x 18 x 18'],
    ['M2-HCg18', 16.00, 10.25, 0.25, 'Bubble Mailer #5 10.5 x 16'],
    ['M2-HCg18', 7.25, 4.75, 1.00, 'Bubble Mailer #4 7.25 x 5'],
    ['M2-HCg18', 9.25, 7.25, 1.00, 'Bubble Mailer DVD 10.25 x 7.25'],
    ['M2-HCg18', 28.00, 14.00, 8.00, '28x14x8'],
    ['M2-HCg18', 28.00, 14.00, 0.25, '28x14x4'],
    ['M2-HCg18', 16.00, 10.25, 0.25, 'Bubble Mailer #5 10.5 x 16'],
    ]}
>>> {i:[x for x in j if x[3] > 0.5] for i,j in mydict.items()}
{3603172: [['M2-HCg18', 12.0, 12.0, 9.0, '12 x 12 x 9'], ['M2-HCg18', 16.0, 14.0, 8.0, '16 x 14 x 8'], ['M2-HCg18', 16.0, 14.0, 14.0, '16 x 14 x 14'], ['M2-HCg18', 18.0, 18.0, 18.0, '18 x 18 x 18'], ['M2-HCg18', 7.25, 4.75, 1.0, 'Bubble Mailer #4 7.25 x 5'], ['M2-HCg18', 9.25, 7.25, 1.0, 'Bubble Mailer DVD 10.25 x 7.25'], ['M2-HCg18', 28.0, 14.0, 8.0, '28x14x8']]}
>>> pprint({i:[x for x in j if x[3] > 0.5] for i,j in mydict.items()})
{3603172: [['M2-HCg18', 12.0, 12.0, 9.0, '12 x 12 x 9'],
           ['M2-HCg18', 16.0, 14.0, 8.0, '16 x 14 x 8'],
           ['M2-HCg18', 16.0, 14.0, 14.0, '16 x 14 x 14'],
           ['M2-HCg18', 18.0, 18.0, 18.0, '18 x 18 x 18'],
           ['M2-HCg18', 7.25, 4.75, 1.0, 'Bubble Mailer #4 7.25 x 5'],
           ['M2-HCg18', 9.25, 7.25, 1.0, 'Bubble Mailer DVD 10.25 x 7.25'],
           ['M2-HCg18', 28.0, 14.0, 8.0, '28x14x8']]}

答案 2 :(得分:0)

使用反转列出列表列表并从原始词典中删除列表

k = mydict.keys()[0]
for  val in reversed(mydict[k]):
    if val[3]  < .5:
        mydict[k].remove(val)
print(mydict)

如果您有多个密钥:

for  v in mydict.itervalues():
    for val in reversed(v):
        if val[3] < .5:
            v.remove(val)
print(mydict)