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

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

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

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 вместе, что, по вашему мнению, является нежелательным результатом.
  • Вы также можете сохранить словарь результатов для проверки дубликатов, если вы считаете, что это будет проблемой.

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

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

  • list () использует больше памяти, чем понимание списков
  • Элегантный способ удаления элементов в списке, которые не имеют подстрок, которые отображаются в другом списке
  • сравнение строк в списке со строками в списке
  • Присвоить значение отдельной ячейке в двухмерном массиве python
  • Как удалить повторяющиеся значения в списке?
  • Как создать список исправлений в python?
  • Найти, если значение существует в нескольких списках
  • когда array.array более эффективен, чем списки?
  • Python - лучший язык программирования в мире.