Уникальные клики в списке в (Python) - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть список со списками:

cliques = [ [1,9,5], [3,5,4], [10,7,0], [2,7,5], [6,11], [6,5,4], [3,1], [11, 0]]

Я выбираю один элемент из списка случайным образом:

rand_clique = numpy.random.choice(cliques)

Например cliques[2] = [10,7,0] И я хочу создать новый список с уникальные значения внутри Cliques элементов. В результате я получаю список:

unique_cliques = [[10,7,0], [1,9,5], [6,11]]

Я написал код, но я думаю, что его можно оптимизировать лучше, как я могу это сделать?

import numpy as np

unique_cliques = []
not_unique_cliques = []

cliques = [[1, 9, 5], [3, 5, 4], [10, 7, 0], [2, 7, 5], [6, 11], [6, 5, 4], [3, 1], [11, 0]]
rand_clique = np.random.choice(cliques)
unique_cliques.append(rand_clique)

for elem in rand_clique:
    not_unique_cliques.append(elem)

for clique in cliques:
    temp = []
    count = 0
    for elem in clique:
        if elem not in not_unique_cliques:
            count += 1
            temp.append(elem)
    if count == len(clique):
        unique_cliques.append(clique)
        not_unique_cliques = not_unique_cliques + temp

print(rand_clique)
print(unique_cliques)

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

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

Использование наборов должно повысить эффективность:

import random
cliques = [[1, 9, 5], [3, 5, 4], [10, 7, 0], [2, 7, 5], [6, 11], [6, 5, 4], [3, 1], [11, 0]]
rand_clique = random.choice(cliques)
unique_cliques = [rand_clique]
nonunique_elements = set(rand_clique)
for clique in cliques:
   if not set(clique).intersection(nonunique_elements):
       unique_cliques.append(clique)
       nonunique_elements.update(clique)
print(unique_cliques)

Кстати, обратите внимание, что результат отличается в зависимости от того, какая клика была выбрана с помощью random.choice!

0 голосов
/ 16 апреля 2020

Вы можете построить список из перетасованной версии списка кликов, отфильтровав видимые значения:

import random
cliques = [[1, 9, 5], [3, 5, 4], [10, 7, 0], [2, 7, 5], [6, 11], [6, 5, 4], [3, 1], [11, 0]]

unique_cliques = []
seen = set()
for clique in random.sample(cliques,len(cliques)):
    if seen.intersection(clique): continue
    seen.update(clique)
    unique_cliques.append(clique)

print(unique_cliques) # your results will vary

# [[6, 11], [3, 5, 4], [10, 7, 0]]

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

0 голосов
/ 15 апреля 2020

Я старался изо всех сил:

import numpy as np

unique_cliques = []
not_unique_cliques = []

cliques = [[1, 9, 5], [3, 5, 4], [10, 7, 0], [2, 7, 5], [6, 11], [6, 5, 4], [3, 1], [11, 0]]
rand_clique = np.random.choice(cliques)
unique_cliques.append(rand_clique)
not_unique_cliques.extend(rand_clique)

for clique in cliques:
    if len(set(clique)&set(not_unique_cliques))==0:
        unique_cliques.append(clique)
        not_unique_cliques.extend(clique)


print(rand_clique)
print(unique_cliques)
...