вернуть словарь имен файлов в качестве ключей и списков слов со словами, уникальными для файла в качестве значений - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь написать функцию для извлечения только слов, уникальных для каждого ключа, и перечисления их в выводе словаря, например {"key1": "уникальные слова", "key2": "уникальные слова", ...}.Я начинаю со словаря.Чтобы проверить, я создал простой словарь:

d = {1:["one", "two", "three"], 2:["two", "four", 
"five"], 3:["one","four", "six"]}

Мой вывод должен быть:

{1:"three", 
 2:"five",
 3:"six"}

Я думаю, возможно, разделить на отдельные списки

def return_unique(dct):
    Klist = list(dct.keys())
    Vlist = list(dct.values())
    aList = []
    for i in range(len(Vlist)):
        for j in Vlist[i]:
             if    

Я застрял в том, как мне сказать Python сделать это: если Vlist [i] [j] нет в остальной части Vlist, то aList.append (Vlist [i] [j]).

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

Набор Разница Оператор возвращает разницу между двумя наборами:

>>> a = set([1, 2, 3])
>>> b = set([2, 4, 6])
>>> a - b
{1, 3}

Мы можем использовать это для получения значений, уникальных для каждого ключа.Упаковка их в простую функцию приводит к:

def unique_words_dict(data):
    res = {}
    values = []
    for k in data:
        for g in data:
            if g != k:
                values += data[g]
        res[k] = set(data[k]) - set(values)
        values = []
    return res

>>> d = {1:["one", "two", "three"],
         2:["two", "four", "five"], 
         3:["one","four", "six"]}

>>> unique_words_dict(d)
{1: {'three'}, 2: {'five'}, 3: {'six'}}

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

>>> from functools import reduce
>>> {k: set(d[k]) - set(reduce(lambda a, b: a+b, [d[g] for g in d if g!=k], [])) for k in d}
{1: {'three'}, 2: {'five'}, 3: {'six'}}
0 голосов
/ 11 февраля 2019

Вы можете попробовать что-то вроде этого:

def return_unique(data):
   all_values = []
   for i in data.values():  # Get all values
       all_values = all_values + i

   unique_values = set([x for x in all_values if all_values.count(x) == 1])  # Values which are not duplicated

   for key, value in data.items():  # For Python 3.x ( For Python 2.x -> data.iteritems())
      for item in value: # Comparing values of two lists
         for item1 in unique_values:
             if item == item1:
                 data[key] = item
   return data


d = {1:["one", "two", "three"], 2:["two", "four", "five"], 3:["one","four", "six"]}
print (return_unique(d))

результат >> {1: «три», 2: «пять», 3: «шесть»}

...