Фильтровать список словарей по значению ключа - PullRequest
0 голосов
/ 09 октября 2019

если в списке словарей два значения идентичны, я бы хотел, чтобы список был отфильтрован только одним из словарей. Мне плевать на второй (или третий соответствующий словарь).

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'},
    ]

или любой другойдругая комбинация значений CRC, соответствующих 55A0669C и 66B07710. Список словарей может быть длиной не менее 400 наименований.

Я использую python 3.7

Ответы [ 2 ]

1 голос
/ 09 октября 2019

если это только 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'}]
0 голосов
/ 09 октября 2019

Решение

Вы можете использовать приведение списка словарей в фрейм данных, а затем выбрать уникальные значения crc. Наконец, вы можете получить первые вхождения дубликатов crc значений с помощью list.index(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']

Создание Dict только с уникальными 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'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...