保持一组看到值的key
并删除具有相同值的任何字典:
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'}]
如果值总是分组,你可以使用key
的value
来分组并得到每组的第一个字典:
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'}]
或者使用类似于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'}]
如果你不关心哪个傻瓜被去除了刚刚使用了反转:
st = set()
for d in reversed(thelist):
vals = d["key"],d["k2"]
if vals in st:
thelist.remove(d)
st.add(vals)
print(thelist)
要忽略所有栏ignore_key使用groupby:
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'}]
是你的价值观总是可哈希? – DSM
感谢您的回复。对不起 - 示例情况并不明确。有多个键值对,只有一个键可以忽略。 – user4467853
@DSM是的,值始终是可散列的(文本和日期时间对象)。 – user4467853