我一直在找几个小时,但却找不到 完全 我需要的东西,所以我想我会问。我正在尝试根据另一个词典列表从列表列表中删除元素。我有一个项目列表,我不想在列表列表中显示。
exclude_list = [{'arb_field_1': '0', 'arb_field_2': '59',
'surrogate_key': '0502f5fb0731b5afc'},
{'arb_field_1': '0', 'arb_field_2': '62',
'surrogate_key': '1676c663914864973'},
{'arb_field_1': '0', 'arb_field_2': '62',
'surrogate_key': '2fc1ed4adffbb635'}]
然后我有我的主列表,我想根据词典排除列表中的surrogate_key删除元素。
prim_list = [['0502f5fb0731b5afc', 'bla_bla_bla', 'foo_bar1'],
['0502f5fb0731b5afc', 'john_smith', 'dummy_data_elem1'],
['002b2a71e8b514', '5450464', 'data_i_dont_care_about'],
['2fc1ed4adffbb635', '05d3mh', 'obfuscated_field1'],
['12319618913119', 'granny_apples', 'filler_filler']]
我有以下循环可行(感觉不是非常pythonic,但我是Python新手所以我愿意接受建议)..但 仅 < / strong>删除匹配的一个实例,我需要删除匹配的 所有 实例。
for exclude_list_item in exclude_list:
for i, v in enumerate(prim_list):
if v[0] == exclude_list_item.get('surrogate_key'):
prim_list.remove(prim_list[i])
我想要最终得到的是这样的列表列表:
prim_list = [['002b2a71e8b514', '5450464', 'data_i_dont_care_about'],
['12319618913119', 'granny_apples', 'filler_filler']]
答案 0 :(得分:2)
那么,你想要删除以删除所有exclude_list_item
,而不仅仅是第一个?
我建议改为构建一个新列表。因此,您遍历列表,并将项目附加到新的列表项(如果它不在您的排除列表中)。
原因是从列表中删除在计算上比删除多个随机项更昂贵。
new_prim_list = []
for v in prim_list:
for exclude_list_item in exclude_list:
if v[0] == exclude_list_item.get('surrogate_key'):
break
else:
new_prim_list.append(v)
prim_list = new_prim_list
编辑:修复代码
请注意,这不会影响对列表的其他引用,因此如果要将列表修改为函数的一部分,则调用者不会在列表中看到修改。任何直接将新数组分配给prim_list
的解决方案都会出现同样的问题,
像任何形式的构造
prim_list = [...]
答案 1 :(得分:1)
使用list.remove
从列表中删除第一个实例,而不是每个实例。为了方便起见,让我们进行一次通过,我们将surrogate_key
积累到一个集合中以进行有效的成员资格测试:
>>> exclude_list = [{'arb_field_1': '0', 'arb_field_2': '59', 'surrogate_key': '0502f5fb0731b5afc'}, {'arb_field_1': '0', 'arb_field_2': '62', 'surrogate_key': '1676c663914864973'}, {'arb_field_1': '0', 'arb_field_2': '62', 'surrogate_key': '2fc1ed4adffbb635'}]
>>> prim_list = [['0502f5fb0731b5afc', 'bla_bla_bla', 'foo_bar1'], ['0502f5fb0731b5afc', 'john_smith', 'dummy_data_elem1'], ['002b2a71e8b514', '5450464', 'data_i_dont_care_about'], ['2fc1ed4adffbb635', '05d3mh', 'obfuscated_field1'], ['12319618913119', 'granny_apples', 'filler_filler']]
>>> exclude_key = set()
>>> for d in exclude_list:
... key = d.get('surrogate_key')
... if key is not None:
... exclude_key.add(key)
...
然后,只需使用list-comprehension进行过滤:
>>> prim_list = [sub for sub in prim_list if sub[0] not in exclude_key]
>>> prim_list
[['002b2a71e8b514', '5450464', 'data_i_dont_care_about'], ['12319618913119', 'granny_apples', 'filler_filler']]
答案 2 :(得分:1)
首先过滤某些集合中的代理键。
set_surr = set( [i.get('surrogate_key') for i in exclude_list] )
现在我们可以创建新列表并使用上面的设置作为查找。
prim_list = [ i for i in prim_list if i[0] not in set_surr ]
单线解决方案:
prim_list = [ i for i in prim_list if i[0] not in set( [j.get('surrogate_key') for j in exclude_list] ) ]