преобразовать все дубликаты перестановки в один уникальный элемент - PullRequest
0 голосов
/ 24 марта 2020

У меня есть данные, которые содержат следующие 10 слов:

[A, B, C, D, E, F, G, H, I, J]

I иметь набор данных, который содержит комбинации таких слов, как:

  • A, B
  • A, B, C, D
  • E, F, G
  • Н ... и так далее.

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

  1. A, B, C, D, E
  2. C, A, B, D, E
  3. D, A, B, C, E и т. Д. (Для 10 элементов было бы около 9 миллионов повторяющихся комбинаций, но только 1023 неповторяющихся комбинации. Мои данные имеют около 1700, то есть некоторые повторения)

Я хочу преобразовать все это в одно уникальное значение (все три элемента имеют одинаковые слова в разном порядке, поэтому все три преобразуем в, скажем, A, B, C, D, E), который может быть любым, но должен выполняться для всех значений, имеющих одинаковые слова. Как сделать это, используя Python?

Я смог сгенерировать уникальные перестановки, используя эту формулу в python:

stuff = ['A','B','C','D','E','F','G','H','I','J']
combinations=list()
for L in range(1, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        print(list(subset))

Как мне преобразовать эти 1700 в 1023 уникальных значения?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Вы можете использовать набор Frozensets. Предполагая, что набор данных является списком списков (или, в общем, итеративным из итераций, вы можете сделать:

resul = set((frozenset(elt) for elt in dataset))

Внутренние элементы должны быть frozenset, потому что набор не может содержать изменяемые элементы.

Вы можете преобразовать это обратно в список списков с помощью:

filtered_dataset = [list(elt) for elt in resul]
0 голосов
/ 24 марта 2020

Похоже, что вы ищете "набор мощности" вашего списка слов. Вы можете легко найти способ сделать это с помощью itertools здесь .

Для нумерации наборов используйте двоичную кодировку присутствия или отсутствия каждого элемента. Это дает вам прямое обращение. Например, {G, H, J} будет отображаться в 0000001101 или ID 13. Вы можете выполнить преобразование любым способом с пониманием списка, например,

bits = [int(word) for word in word_list]

Этого достаточно, чтобы переместить вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...