Как создать новый список кортежей с существующим списком кортежей - PullRequest
0 голосов
/ 11 июля 2020

У меня есть список таких кортежей -

list1 = [('alpha', 'beta'),
         ('beta','gama')
         ('alpha','lamda')
         ('gama', 'lamda'),
         ('euphor', 'tuphor')]

И я хочу создать новый список на основе logi c, который -

для каждой пары, которая не ' Существующие в исходном списке будут включены в новый список, например:

new_list = [('alpha','gama'),
            (alpha, tuphor),
            (alpha, euphor),
            (beta,lamda),
            ()...]

аналогично.

Может ли кто-нибудь предложить способ сделать это в python?

Спасибо.

Ответы [ 4 ]

1 голос
/ 11 июля 2020
from itertools import combinations

list1 = [('alpha', 'beta'),
         ('beta','gama'),
         ('alpha','lamda'),
         ('gama', 'lamda'),
         ('euphor', 'tuphor')]

elements = list(set([e for l in list1 for e in l])) # find all unique elements

complete_list = list(combinations(elements, 2)) # generate all possible combinations

#convert to sets to negate the order

set1 = [set(l) for l in list1]
complete_set = [set(l) for l in complete_list]

# find sets in `complete_set` but not in `set1`
ans = [list(l) for l in complete_set if l not in set1]

Вывод:

[['euphor', 'lamda'],
 ['euphor', 'gama'],
 ['euphor', 'beta'],
 ['euphor', 'alpha'],
 ['lamda', 'beta'],
 ['lamda', 'tuphor'],
 ['gama', 'alpha'],
 ['gama', 'tuphor'],
 ['beta', 'tuphor'],
 ['tuphor', 'alpha']]
1 голос
/ 11 июля 2020

Вот решение с использованием itertools и наборов:

list1 = [('alpha', 'beta'),
         ('beta','gama'), 
         ('alpha','lamda'), 
         ('gama', 'lamda'),
         ('euphor', 'tuphor')]

all_items = set(itertools.chain(*list1))

all_pairs = set(itertools.product(all_items, all_items))
new_pairs = all_pairs.difference(list1)

Результат (new_pairs):

{('alpha', 'alpha'),
 ('alpha', 'euphor'),
 ('alpha', 'gama'),
 ('alpha', 'tuphor'),
 ('beta', 'alpha'),
 ('beta', 'beta'),
 ('beta', 'euphor'),
 ('beta', 'lamda'),
 ('beta', 'tuphor'),
 ...
0 голосов
/ 11 июля 2020

Вам просто нужно получить уникальные имена в исходном списке, а затем применить условие if. Попробуйте это и дайте мне знать, если у вас возникнут проблемы.

new_list = []
names = set(np.array(list1).ravel())
for i in names:
    for j in names:
        if i!=j:
            if ((i,j) not in list1) & ((j,i) not in list1) & ((i,j) not in new_list) & ((j,i) not in new_list):
                new_list.append((i,j))
0 голосов
/ 11 июля 2020

Вы можете

  • собрать разные элементы
  • вычислить все перестановки
  • получить разницу между всеми комбинациями и существующими
list1 = [('alpha', 'beta'), ('beta', 'gama'), ('alpha', 'lamda'), ('gama', 'lamda'), ('euphor', 'tuphor')]
from itertools import chain, combinations

items = set(chain(*list1))  # {'euphor', 'gama', 'tuphor', 'beta', 'lamda', 'alpha'}

all_perm = set(combinations(items, r=2))
new_perm = all_perm - set(list1)

print(len(all_perm), all_perm)  # 30
print(len(new_perm), new_perm)  # 25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...