問題
假設我有以下字典串列:
givenValues=[
{'id': '0001', 'name': 'me'},
{'id': '0002', 'name': 'me'},
{'id': '0001', 'name': 'you'},
{'id': '0003', 'name': 'hi'},
{'id': '0001', 'name': 'they'},
{'id': '0002', 'name': 'me'},
{'id': '0002', 'name': 'me'}
]
所需結果
我想保留每個唯一 id 中的第一個并從串列中洗掉所有其他字典,以便結果是
[
{'id': '0001', 'name': 'me'},
{'id': '0002', 'name': 'me'},
{'id': '0003', 'name': 'hi'}
]
到目前為止,我已經嘗試了以下方法。如果串列中的字典排列方式不同但并非總是如此,則某些嘗試確實有效:
嘗試 1
tempList=[]
for i in range(len(givenValues)):
for j in range(i 1, len(givenValues)):
if givenValues[i]['id']==givenValues[j]['id']:
tempList.append(givenValues[j])
for item in tempList:
if item in givenValues:
givenValues.remove(item)
結果:
[
{'id': '0001', 'name': 'me'},
{'id': '0003', 'name': 'hi'}
]
嘗試 2
for i in range(len(givenValues)):
if i<len(givenValues):
for j in range(i 1, len(givenValues)):
if i<len(givenValues) and givenValues[i]['id']==givenValues[j]['id']:
givenValues.remove(givenValues[j])
結果
[
{'id': '0001', 'name': 'me'},
{'id': '0003', 'name': 'hi'},
{'id': '0001', 'name': 'they'},
{'id': '0002', 'name': 'me'}
]
請幫我解決這個問題。
uj5u.com熱心網友回復:
這是一種可能的解決方案:
data = [
{"id": "0001", "name": "me"},
{"id": "0002", "name": "me"},
{"id": "0001", "name": "you"},
{"id": "0003", "name": "hi"},
{"id": "0001", "name": "they"},
{"id": "0002", "name": "me"},
{"id": "0002", "name": "me"},
]
selected = {}
for item in data:
if item["id"] not in selected:
selected[item["id"]] = item
output = list(selected.values())
print(output)
我們使用字典來跟蹤唯一的專案,并利用字典的.values()方法以插入的順序回傳專案的事實(因此這保留了我們在原始串列中找到專案的順序)。
上面的代碼輸出:
[{'id': '0001', 'name': 'me'}, {'id': '0002', 'name': 'me'}, {'id': '0003', 'name': 'hi'}]
這是解決此問題的另一種方法,使用itertools.groupby:
import itertools
data = [
{"id": "0001", "name": "me"},
{"id": "0002", "name": "me"},
{"id": "0001", "name": "you"},
{"id": "0003", "name": "hi"},
{"id": "0001", "name": "they"},
{"id": "0002", "name": "me"},
{"id": "0002", "name": "me"},
]
output = []
for k, g in itertools.groupby(sorted(data, key=lambda item: item['id']), lambda item: item['id']):
output.append(next(g))
print(output)
這會產生相同的輸出。它的作業原理是將串列中的專案按 分組id,然后從每個組中取出第一項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/515893.html
