Как я могу запустить метод set для списков в терминах словарных ключей / значений, чтобы найти уникальные элементы и вывести результаты сравнения? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть словарь со значениями в виде списков текстовых значений.(ID: [текстовые значения]) Ниже приведена выдержка.

data_dictionary = {
    52384: ['text2015', 'webnet'], 
    18720: ['datascience', 'bigdata', 'links'],
    82465: ['biological', 'biomedics', 'datamining', 'datamodel', 'semantics'],
    73120: ['links', 'scientometrics'],
    22276: ['text2015', 'webnet'],
    97376: ['text2015', 'webnet'],
    43424: ['biological', 'biomedics', 'datamining', 'datamodel', 'semantics'],
    23297: ['links', 'scientometrics'],
    45233: ['webnet', 'conference', 'links']
}

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

dd = defaultdict(list)
    for k, v in dictionary_name.items():
        dd[tuple(v)].append(k)

, который дал результирующий список уникальных идентификаторов и их текстовые значения:

{('text2015', 'webnet'): [52384, 22276, 97376], ('datascience', 'bigdata', 'links'): [18720], ('biological', 'biomedics', 'datamining', 'datamodel', 'semantics'): [82465, 43424], ('links', 'scientometrics'): [73120, 23297]})

Каждый из этих ключей имеет сумму, которую я извлекаю изsum_dictionary.

def extract_sum(key_id, sum_dictionary):
    for k,v in sum_dictionary.items():
        if key_id == k:
            k_sum = v
    return k_sum

Здесь можно найти словарь извлеченной суммы.

sum_dict = { 52384:1444856137000,18720:1444859841000, 82465:1444856, 22276:1674856137000,  97376:1812856137000,43424:5183856,23297:1614481000, 45233:1276781300}

Я хочу вывести файлы с одним или несколькими одинаковыми текстовыми значениями, в том числе, если одно значение имеет больше или меньше значенияобщие текстовые значения.И получить результат в виде:

ID_1;ID_2;Sum_for_ID_1;Sum_for_ID_2;[одно или несколько общих текстовых значений между ID_1 и ID_2]

, где Sum_for_ID_1

45233;52384;1276781300;1444856137000;['webnet']

52384;97376;1444856137000;1812856137000;['text2015', 'webnet']

18720;18720;1444859841000;1444859841000;['datascience', 'bigdata', 'links']

73120;23297;144481000;1614481000;['links', 'scientometrics']

(на строку)

Я пытался использовать itertools, чтобы найти все комбинации всех слов в значениях словаря, но итерации занимают слишком многовремя тренировки.

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

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Используя приведенный выше пример из vishes_shell выше, мне удалось получить большую часть желаемого результата.Чтобы добавить отдельные суммы, я подумал о необходимости перезапуска метода извлечения суммы, который кажется неоптимальным.Таким образом, я оставил это вне решения, поскольку я придумываю другой путь.

for first, second in combinations(data_dictionary.items(), r=2):
    intersection = set(first[1]) & set(second[1])
    if intersection:
        sum1 = extract_sum(first[0], sum_dict)
        sum2 = extract_sum(second[0], sum_dict)
        if sum1 < sum2:
            early =first[0]
            late = second[0]
        else:
            early = second[0]
            late = first[0]

        filename.write('%d , %d , %s' % (early, late, list(intersection)))
        filename.write('\n')
0 голосов
/ 19 декабря 2018

Это не полное решение вашей проблемы, но часть ее, поскольку я считаю, что она решает большую часть проблемы:

In [1]: data_dictionary = {
   ...:     52384: ['text2015', 'webnet'],
   ...:     18720: ['datascience', 'bigdata', 'links'],
   ...:     82465: ['biological', 'biomedics', 'datamining', 'datamodel', 'semantics'],
   ...:     73120: ['links', 'scientometrics'],
   ...:     22276: ['text2015', 'webnet'],
   ...:     97376: ['text2015', 'webnet'],
   ...:     43424: ['biological', 'biomedics', 'datamining', 'datamodel', 'semantics'],
   ...:     23297: ['links', 'scientometrics'],
   ...:     45233: ['webnet', 'conference', 'links']
   ...: }

In [2]: from itertools import combinations
   ...:
   ...: intersections = []
   ...:
   ...: for first, second in combinations(data_dictionary.items(), r=2):
   ...:     intersection = set(first[1]) & set(second[1])
   ...:     if intersection:
   ...:         intersections.append((first[0], second[0], list(intersection)))
   ...:

In [3]: intersections
Out[3]:
[(52384, 22276, ['webnet', 'text2015']),
 (52384, 97376, ['webnet', 'text2015']),
 (52384, 45233, ['webnet']),
 (18720, 73120, ['links']),
 (18720, 23297, ['links']),
 (18720, 45233, ['links']),
 (82465,
  43424,
  ['semantics', 'datamodel', 'biological', 'biomedics', 'datamining']),
 (73120, 23297, ['links', 'scientometrics']),
 (73120, 45233, ['links']),
 (22276, 97376, ['webnet', 'text2015']),
 (22276, 45233, ['webnet']),
 (97376, 45233, ['webnet']),
 (23297, 45233, ['links'])]

Что он делает, он создает пары каждого элемента вашего data_dictionary и затем проверяет, не является ли пересечение значений не пустым, затем помещает это в массив intersections в виде (key1, key2, intersection).

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

...