遍历Dict值列表并从该列表中删除元素

时间:2019-02-01 21:57:13

标签: python list-comprehension

我有一个字典列表,如下所示:

Dict1 = [{'Title': 'Title1', 'Attributes':['name1.50', 'name2.40', 'name1.90']}, 
         {'Title': 'Title2', 'Attributes':['name2.90', 'name1.40', 'name1.90']}]

我想遍历此字典,然后遍历每个字典中的'Attributes'键,以查找以'name1'开头但其中没有.90的值,并将其从'Attributes'键。

因此最终的字典应如下所示:

Dict1 = [{'Title': 'Title1', 'Attributes':['name1.90']}, 
         {'Title': 'Title2', 'Attributes':['name2.90', 'name1.90']}]

我的迭代逻辑为

for item in Dict1:
    for name in item['Attributes']:
        if 'name1' in name:
            if name.split(".")[1] not '90':
                item['Attributes'].remove(name)

但是,我发现它并没有删除其中所有缺少的.90的值。我尝试了一些列表理解,但没有帮助。我是python和编码方面的新手,所以我敢肯定有一种更简单的方法可以做到这一点。

3 个答案:

答案 0 :(得分:2)

  • name.split(".")[1] not '90'是语法错误,只需使用!=。 Python不仅是由notisreducelambda ...
  • 组成的隐秘语言 在元素上进行迭代时,完成
  • item['Attributes'].remove(name)。容易出错:您可以跳过一些元素

最好的方法是在列表理解中重建字典列表,并在字典理解中重建每个字典的过滤器:

Dict1 = [{'Title': 'Title1', 'Attributes':['name1.50', 'name2.40', 'name1.90']}, {'Title': 'Title2', 'Attributes':['name2.90', 'name1.40', 'name1.90']}]

new_dict_list = [{'Title':d['Title'], 'Attributes':[v for v in d['Attributes'] if v.endswith(".90")]} for d in Dict1]

结果:

[{'Attributes': ['name1.90'], 'Title': 'Title1'},
{'Attributes': ['name2.90', 'name1.90'], 'Title': 'Title2'}]

少一些理解:

new_dict_list = []
for d in Dict1:
    values = [v for v in d['Attributes'] if v.endswith(".90")]
    new_dict_list.append({'Title':d['Title'], 'Attributes':values})

v.endswith(".90")可以是90 in vnot v.startswith('name1') and v.endswith('.90'),不确定确切的条件,但我会让读者了解。

答案 1 :(得分:0)

def solve():
    array = [{'Title': 'Title1', 'Attributes':['name1.50', 'name2.40', 'name1.90']}, {'Title': 'Title2', 'Attributes':['name2.90', 'name1.40', 'name1.90']}]

    for item in array:
        new_names = []
        for name in item['Attributes']:
            if '90' in name: new_names.append(name)
            elif 'name1' not in name: new_names.append(name)
        item['Attributes'] = new_names
    print(array)

solve()

输出:[{'Title': 'Title1', 'Attributes': ['name2.40', 'name1.90']}, {'Title': 'Title2', 'Attributes': ['name2.90', 'name1.90']}]

答案 2 :(得分:0)

您非常接近正确的答案。在Python中,你不能在一个键/值对操纵值。所以不是,我试过这种方法,这将产生你想要的输出。

for x in Dict1:
    new_attributes = []
    print(x)
    for i in x['Attributes']:
        if i.split('.')[1] == '90':
            new_attributes.append(i)
    del x['Attributes'] #Not required. Can directly write the new list in the key
    x['Attributes'] = new_attributes

这将创建一个新的列表只存储所需的值,删除旧的Attributes键,并创建一个新的包含新的列表。