Python Словарь: ключи возврата на основе совпадающих значений в списке - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть словарь, в котором ключ - это уникальное имя, а значение - список неуникальных имен. Для знания предметной области ключи - это рабочие таблицы Tableau, а значение представляет собой список таблиц, к которым подключается рабочая книга.

Я пытаюсь сделать так, чтобы для каждого ключа возвращался каждый второй ключ, имеющий не менее трех соответствующие значения. Это, в основном, позволит мне находить книги, которые перекрывают данные, используя те же таблицы.

В настоящее время я могу найти все ключи, которые соответствуют указанному значению c, выполнив следующие действия:

keys = [key for key, value in intersect_dict.items() if 'VOLUME_DIMENSION' in value]
keys

values = [value for key, value in intersect_dict.items() if 'VOLUME_DIMENSION' in value]
values

Вывод ключей:

['(SAN) STORAGE GROUP INVENTORY AND CAPACITY',
 '(SAN) STORAGE GROUP INVENTORY AND CAPACITY V2',
 'SAN INVENTORY AND CAPACITY']

И вывод значений:

[['VOLUME_DIMENSION',
  'EXTENDED_DATA',
  'VOLUME_HISTORY_CAPACITY_FACT',
  'HOST_DIMENSION',
  'STORAGE_DIMENSION',
  'DATE_DIMENSION'],
 ['STORAGE_DIMENSION',
  'DATE_DIMENSION',
  'VOLUME_DIMENSION',
  'HOST_DIMENSION',
  'VOLUME_HISTORY_CAPACITY_FACT',
  'EXTENDED_DATA'],
 ['VOLUME_HISTORY_CAPACITY_FACT',
  'HOST_DIMENSION',
  'EXTENDED_DATA',
  'DATE_DIMENSION',
  'STORAGE_DIMENSION',
  'VOLUME_DIMENSION']]

Есть ли возможный способ, которым я могу сделать по сути то же самое за исключением того, что вместо

if 'VOLUME_DIMENSION' in value у меня есть if values in value match 3 times or more?

Пожалуйста, дайте мне знать, если требуется дополнительная информация.

Edit1: Ниже запрошенная выдержка из словаря ввода:

{'(SAN) STORAGE GROUP INVENTORY AND CAPACITY': ['VOLUME_DIMENSION',
  'EXTENDED_DATA',
  'VOLUME_HISTORY_CAPACITY_FACT',
  'HOST_DIMENSION',
  'STORAGE_DIMENSION',
  'DATE_DIMENSION'],
 '(SAN) STORAGE GROUP INVENTORY AND CAPACITY V2': ['STORAGE_DIMENSION',
  'DATE_DIMENSION',
  'VOLUME_DIMENSION',
  'HOST_DIMENSION',
  'VOLUME_HISTORY_CAPACITY_FACT',
  'EXTENDED_DATA'],

Запрошенный вывод будет выглядеть примерно так:

{'(SAN) STORAGE GROUP INVENTORY AND CAPACITY': workbook1, workbook7, workbook8}

"Рабочие книги", показанные в качестве значений, будут рабочими книгами, имеющими три или более совпадающих значения с этим ключом.

Edit2: извините за неправильное объяснение формата данных. Попытка уточнить это здесь.

d = { 
    'item1': ['A', 'B', 'C'], 
    'item2': ['A', 'B', 'C', 'D'], 
    'item3': ['A', 'C', 'D'], 
    'item4': ['B', 'C', 'D', 'E'], 
    'item5': ['A', 'B', 'C'], 
    'item6': ['A', 'B', 'C', 'E'], 
    }

Results = { 
    'item1': ['item2', 'item5', 'item6'] 
    'item2': ['item1', 'item5', 'item6'] 
    }

В приведенном выше примере d будет моим общим набором данных в виде словаря, а результаты - это то, что я хотел бы для вывода. Так что это позволило бы мне определить, какие элементы делятся данными. Или в этом случае делимся письмами.

1 Ответ

1 голос
/ 26 февраля 2020

Я бы использовал set:

d = {
    'item1': ['A', 'B', 'C'],
    'item2': ['A', 'B', 'C', 'D'],
    'item3': ['A', 'C', 'D'],
    'item4': ['B', 'C', 'D', 'E'],
}

search_items = {'A', 'B', 'C'}
keys = [key for key, value in d.items() if len(search_items & set(value)) >= 3]
print(keys)

values = [value for key, value in d.items() if len(search_items & set(value)) >= 3]
print(values)

Вывод:

['item1', 'item2']
[['A', 'B', 'C'], ['A', 'B', 'C', 'D']]

Чтобы получить все ключи, которые разделяют три или более элементов, вы можете сделать:

common_items = [
    (search_key, key, set(search_values) & set(values))
    for search_key, search_values in d.items()
    for key, values in d.items()
    if search_key != key and len(set(search_values) & set(values)) >= 3
]
print(common_items)
[('item1', 'item2', {'C', 'B', 'A'}),
 ('item2', 'item1', {'C', 'B', 'A'}),
 ('item2', 'item3', {'C', 'D', 'A'}),
 ('item2', 'item4', {'C', 'D', 'B'}),
 ('item3', 'item2', {'C', 'D', 'A'}),
 ('item4', 'item2', {'C', 'D', 'B'})]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...