保持一組看到值的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