Операции над двумя списками

позвольте мне начать с некоторого фона.

Предположим, у меня есть этот список:

interactions = [ ['O1', 'O3'], ['O2', 'O5'], ['O8', 'O10'] ['P3', 'P5'], ['P2', 'P19'], ['P1', 'P6'] ] 

Каждая запись в списке (например, O1, O3 ) представляет собой взаимодействие между двумя объектами (хотя все, что мы имеем в виду здесь, это строки). В списке есть много разных объектов.

У нас также есть следующий список:

 similar = ['O1', 'P23'], ['O3', 'P50'], ['P2', 'O40'], ['P19', 'O22'] 

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

Таким образом, O1 подобен P23 и O3 аналогичен P50 И [O1, O3] взаимодействуют, таким образом, взаимодействие ['P23', 'P50'] является преобразованным взаимодействием.

Аналогично, P2 похож на O40, а P19 похож на O22, а [P2, P19] взаимодействует, таким образом, взаимодействие ['O40', 'O22'] является преобразованным взаимодействием.

Преобразованные взаимодействия всегда будут одного типа, например: [PX, PX] или [OX, OX].

Код

Поэтому я написал следующий код для создания этих отношений:

 from collections import defaultdict interactions = [ ['O1', 'O3'], ['O2', 'O5'], ['O8', 'O10'] ['P3', 'P5'], ['P2', 'P19'], ['P1', 'P6'] ] similar = [ ['O1', 'H33'], ['O6', 'O9'], ['O4', 'H1'], ['O2', 'H12'] ] def list_of_lists_to_dict(list_of_lists): d = defaultdict(list) for sublist in list_of_lists: d[sublist[0]].append(sublist[1]) d[sublist[1]].append(sublist[0]) return d interactions_dict = list_of_lists_to_dict(interactions) similar_dict = list_of_lists_to_dict(similar) for key, values in interactions_dict.items(): print "{0} interacts with: {1}".format(key, ', '.join(values)) if key in similar_dict: print " {0} is similar to: {1}".format(key, ', '.join(similar_dict[key])) forward = True for value in values: if value in similar_dict: print " {0} is similar to: {1}".format(value, ', '.join(similar_dict[value])) reverse = True if forward and reverse: print " thus [{0}, {1}] interact!".format(', '.join(similar_dict[key]), ', '.join(similar_dict[value])) forward = reverse = False 

Моя попытка генерирует правильный вывод, но также создает нежелательный вывод. Например, иногда он будет генерировать выходные данные между различными типами объектов: O1, P1 и между точными одинаковыми объектами: O1, O1 . Он также также выводит повторяющиеся результаты в разных формах, например: O1, P1 , P1, O1 – оба означают одно и то же, поэтому мы хотим только эту запись один раз. Все это нежелательное поведение.

Итак, мой вопрос: как я могу реструктурировать свою попытку решить эту проблему?

Благодарю.

3 Solutions collect form web for “Операции над двумя списками”

Если отношение подобия не является ни симметричным, ни транзитивным:

 from collections import defaultdict from itertools import product # entity -> similar entities d = defaultdict(list) # use `set` if `similar` has duplicate entries for k, v in similar: d[k].append(v) for a, b in interactions: for x, y in product(d[a], d[b]): # a, b interact; a is similar to x, b is similar to y #note: filter undesired x, y interactions here print x, y # transformed interaction 

У меня есть некоторые рекомендации по общему алгоритму:

  • Храните словарь для всех отношений подобия, например, O1: P23 и P23: O1 могут быть в словаре.
  • Прежде чем найти преобразование, убедитесь, что обе части взаимодействия могут быть преобразованы, например, O1 и O3 должны быть как ключами в словаре
  • Это должно препятствовать любому преобразованию, указанному как O и P вместе, что, по вашему мнению, является нежелательным результатом.
  • Вы также можете сохранить словарь результатов для проверки дубликатов, если вы считаете, что это будет проблемой.

Некоторые из этих проблем решаются ответом Дж. Ф. Себастьяна, но я думаю, вы должны обратить внимание на то, как создается оригинальный словарь, что значительно облегчит получение результатов, которые имеют смысл.

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

  • Распаковка списка / кортежей пар на два списка / кортежей
  • Добавить все элементы итерации в список
  • Python: создание всех упорядоченных комбинаций списка
  • python удаляет элементы списка из другого списка. С МНОЖЕСТВЕННЫМИ ВОЗВРАТАМИ элементов в обоих
  • Использование определения списка для соответствия значениям словарей, которые хранятся в списках
  • Как найти все позиции максимального значения в списке?
  • Извлечь первый элемент каждого подписок в python
  • Фильтровать список списков Python другим списком
  • Максимальное значение в списке списков кортежей
  • Удалить элемент списка Python
  • Почему x = x где x - список списков?
  •  
    Interesting Posts for Van-Lav

    Mocking urllib2.urlopen (). Read () для разных ответов

    Почему я не могу изменить или переназначить значения переменных в списках с помощью цикла for (python)?

    Как я могу сделать уникальную очередь приоритетов значений в Python?

    Элементарно логично И на неопределенное количество рядов Панды

    Как передать параметры из одного вида в другое

    Multiplex on queue.Queue?

    Как перенаправить вывод «print» в файл с помощью python?

    urllib2.HTTPError: ошибка HTTP 400: неверный запрос – Python

    Использование Keras & Tensorflow с графическим процессором AMD

    Как проверить, совпадают ли все значения в столбцах матрицы numpy?

    Удаление строк DataFrame в Pandas на основе значения столбца – несколько значений для удаления

    Ошибка установки витой ошибки 1

    Python: Как создать последовательные имена файлов?

    ctypes: Кастовать строку для работы?

    Как я могу избавиться от ошибки импорта ft2font из matplotlib в исходной установке Windows XP?

    Python - лучший язык программирования в мире.