如何删除列表中的重复dict,忽略dict键?

use*_*853 4 python python-2.7

我有一个词典列表.每个字典都有几个键值,以及一个任意(但很重要)的键值对.例如

thelist = [
    {"key" : "value1", "k2" : "va1", "ignore_key" : "arb1"}, 
    {"key" : "value2", "k2" : "va2", "ignore_key" : "arb11"},
    {"key" : "value2", "k2" : "va2", "ignore_key" : "arb113"}
]
Run Code Online (Sandbox Code Playgroud)

我想删除重复的字典,以便只忽略非"ignore-key"值.我已经看到了一个相关的问题 - 但它只考虑完全相同的词汇.有没有办法删除几乎重复,以便上面的数据成为

thelist = [
    {"key" : "value1", "k2" : "va1", "ignore_key" : "arb1"}, 
    {"key" : "value2", "k2" : "va2", "ignore_key" : "arb11"}
]
Run Code Online (Sandbox Code Playgroud)

忽略哪个副本无关紧要.我怎样才能做到这一点?

Pad*_*ham 5

保留一组看到的值key并删除具有相同值的任何dict:

st = set()

for d in thelist[:]:
    vals = d["key"],d["k2"]
    if vals in st:
        thelist.remove(d)
    st.add(vals)
print(thelist)

[{'k2': 'va1', 'ignore_key': 'arb1', 'key': 'value1'},
{'k2': 'va2', 'ignore_key': 'arb11', 'key': 'value2'}]
Run Code Online (Sandbox Code Playgroud)

如果值始终分组,则可以使用valuefrom key来分组并从每个组中获取第一个dict:

from itertools import groupby
from operator import itemgetter
thelist[:] = [next(v) for _, v in groupby(thelist,itemgetter("key","k2"))]
print(thelist)]

print(thelist)
[{'key': 'value1', 'k2': 'va1', 'ignore_key': 'arb1'}, 
{'key': 'value2', 'k2': 'va2', 'ignore_key': 'arb11'}]
Run Code Online (Sandbox Code Playgroud)

或者使用类似于DSM答案的生成器修改原始列表而不复制:

def filt(l):
    st = set()
    for d in l:
        vals = d["key"],d["k2"]
        if vals not in st:
            yield d
        st.add(vals)


thelist[:] = filt(thelist)

print(thelist)

 [{'k2': 'va1', 'ignore_key': 'arb1', 'key': 'value1'}, 
{'k2': 'va2', 'ignore_key': 'arb11', 'key': 'value2'}]
Run Code Online (Sandbox Code Playgroud)

如果您不关心删除哪个欺骗,只需使用反转:

st = set()

for d in reversed(thelist):
    vals = d["key"],d["k2"]
    if vals in st:
        thelist.remove(d)
    st.add(vals)
print(thelist)
Run Code Online (Sandbox Code Playgroud)

要忽略所有使用groupby的ignore_key:

from itertools import groupby

thelist[:] = [next(v) for _, v in groupby(thelist, lambda d: 
                [val for k, val in d.items() if k != "ignore_key"])]
print(thelist)
[{'key': 'value1', 'k2': 'va1', 'ignore_key': 'arb1'},
 {'key': 'value2', 'k2': 'va2', 'ignore_key': 'arb11'}]
Run Code Online (Sandbox Code Playgroud)