[英]Filter list of dictionaries based on the value of a key
如果字典列表中的兩個值相同,我希望僅使用其中一個字典過濾列表。 我不關心第二個(或第三個匹配的字典)。
crcs = [
{'compress_name': 'file1.bin', 'crc': '55A0669C', 'name': 'R:\\filepath\\system\\compress1.zip'},
{'compress_name': 'file3.bin', 'crc': '55A0669C', 'name': 'R:\\filepath\\system\\compress2.zip'},
{'compress_name': 'file2.bin', 'crc': '66B07710', 'name': 'R:\\filepath\\system\\compress2.zip'},
{'compress_name': 'file5.bin', 'crc': '66B07710', 'name': 'R:\\filepath\\system\\compress3.zip'}
]
預期結果是具有不同“crc”值的兩個字典的列表。
[
{'compress_name': 'file1.bin', 'crc': '55A0669C', 'name': 'R:\\filepath\\system\\compress1.zip'},
{'compress_name': 'file2.bin', 'crc': '66B07710', 'name': 'R:\\filepath\\system\\compress2.zip'},
]
或匹配 55A0669C 和 66B07710 的 CRC 值的任何其他組合。 字典列表可能有 400 個或更多項。
我正在使用 python 3.7
如果只有 crc 需要唯一,那么你可以使用
crcs = [ {'compress_name': 'file1.bin', 'crc': '55A0669C', 'name': 'R:\filepath\system\compress1.zip'}, {'compress_name': 'file3.bin', 'crc': '55A0669C', 'name': 'R:\filepath\system\compress2.zip'}, {'compress_name': 'file2.bin', 'crc': '66B07710', 'name': 'R:\filepath\system\compress2.zip'}, {'compress_name': 'file5.bin', 'crc': '66B07710', 'name': 'R:\filepath\system\compress3.zip'} ]
crcs_all = []
crcs_uniq = []
for i in range(len(crcs)):
crc = crcs[i]['crc']
if crc not in crcs_all:
crcs_all.append(crc)
crcs_uniq.append(crcs[i])
print(crcs_uniq)
那會給你
[ {'compress_name': 'file1.bin', 'crc': '55A0669C', 'name': 'R:\x0cilepath\\system\\compress1.zip'},
{'compress_name': 'file2.bin', 'crc': '66B07710', 'name': 'R:\x0cilepath\\system\\compress2.zip'}]
您可以使用種姓將字典列表轉換為 dataframe 然后 select 唯一的crc
值。 最后,您可以使用list.index(crc)
獲取重復的crc
值的第一次出現,並將其存儲在 list unique_idx
中。 我們使用這個unique_idx
從 dataframe df
中過濾掉相關行,然后將該數據提取為dict
。
import pandas as pd
df = pd.DataFrame(crcs)
unique_crcs = df.crc.unique().tolist()
unique_idx = []
for crc in unique_crcs:
unique_idx.append(all_crcs.index(crc))
dfu = df.iloc[unique_idx]
dfu.T.to_dict()
Output :
{0: {'compress_name': 'file1.bin',
'crc': '55A0669C',
'name': 'R:\\filepath\\system\\compress1.zip'},
2: {'compress_name': 'file2.bin',
'crc': '66B07710',
'name': 'R:\\filepath\\system\\compress2.zip'}}
import pandas as pd
crcs = [{'compress_name': 'file1.bin', 'crc': '55A0669C', 'name': r'R:\filepath\system\compress1.zip'},
{'compress_name': 'file3.bin', 'crc': '55A0669C', 'name': r'R:\filepath\system\compress2.zip'},
{'compress_name': 'file2.bin', 'crc': '66B07710', 'name': r'R:\filepath\system\compress2.zip'},
{'compress_name': 'file5.bin', 'crc': '66B07710', 'name': r'R:\filepath\system\compress3.zip'} ]
df = pd.DataFrame(crcs)
print(df)
Output :
compress_name crc name
0 file1.bin 55A0669C R:\filepath\system\compress1.zip
1 file3.bin 55A0669C R:\filepath\system\compress2.zip
2 file2.bin 66B07710 R:\filepath\system\compress2.zip
3 file5.bin 66B07710 R:\filepath\system\compress3.zip
unique_crcs = df.crc.unique().tolist()
all_crcs = df.crc.to_list()
unique_idx = []
uniques = dict()
for crc in unique_crcs:
idx = all_crcs.index(crc)
uniques.update({crc: idx})
unique_idx.append(idx)
print(uniques)
print(all_crcs)
Output :
{'55A0669C': 0, '66B07710': 2}
['55A0669C', '55A0669C', '66B07710', '66B07710']
dfu = df.iloc[unique_idx]
dfu.T.to_dict()
Output :
{0: {'compress_name': 'file1.bin',
'crc': '55A0669C',
'name': 'R:\\filepath\\system\\compress1.zip'},
2: {'compress_name': 'file2.bin',
'crc': '66B07710',
'name': 'R:\\filepath\\system\\compress2.zip'}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.