【问题标题】:Filter list of dictionaries based on the value of a key根据键的值过滤字典列表
【发布时间】:2020-02-06 05:32:39
【问题描述】:

如果字典列表中的两个值相同,我希望仅使用其中一个字典过滤列表。我不关心第二个(或第三个匹配的字典)。

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

【问题讨论】:

  • 你试过什么?请尝试自己解决此问题。

标签: python python-3.x dictionary filter


【解决方案1】:

解决方案

您可以使用种姓将字典列表转换为数据框,然后选择唯一的 crc 值。最后,您可以使用list.index(crc) 获得重复的crc 值的第一次出现,然后将其存储在列表unique_idx 中。我们使用这个unique_idx 从数据框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()

输出

{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'}}

详细解决方案

1。制作数据

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)

输出

  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

选择唯一的 CRC 行

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)

输出

{'55A0669C': 0, '66B07710': 2}
['55A0669C', '55A0669C', '66B07710', '66B07710']

仅使用唯一的 CRC Redords 制作字典

dfu = df.iloc[unique_idx]
dfu.T.to_dict()

输出

{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'}}

【讨论】:

    【解决方案2】:

    如果只有 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'}]
    

    【讨论】:

      猜你喜欢
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2017-04-22
      • 2019-12-27
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多