Как выбрать все возможные пары подсписков из заданного списка, объединением которого будет список? - PullRequest
1 голос
/ 07 июня 2019

С учетом списка сказать [4,5,6,7] я хочу написать функцию, которая будет выводить все пары, такие как ([4,5,7], [6]), ([4,5], [6,7]) длина подсписка не фиксирована

я использовал цикл for и два новых списка для добавления i-го элемента в один список и добавьте оставшиеся в список 2, затем повторите процедуру, я знаю, что это глупый подход

a = [4,5,6,7]
for x in range(0,len(a)):
     b = []
     c = []
     b.append(a[x])
     for y in range(0,len(a)):
          if y!=x:
               c.append(a[y])
     print(b,c)
for x in range(0,len(a)-1):
     b = []
     c = []
     b.append(a[x])
     b.append(a[x+1])
     for y in range(0,len(a)):
          if y!=x and y!=x+1:
               c.append(a[y])
     print(b,c)   

Я ожидаю напечатать все возможные подсписки, но всегда скучаю по несмежным, я получаю ([4, 5], [6,7]), но никогда не генерирую ([4,6], [5,7])

Ответы [ 3 ]

1 голос
/ 07 июня 2019

Вы можете использовать модуль itertools для создания всех таких подсписков:

import itertools as it

s = {4,5,6,7}
for length in range(len(s)):
    for combination in it.combinations(s, length):
        print(list(combination), list(s - set(combination)))
[] [4, 5, 6, 7]
[4] [5, 6, 7]
[5] [4, 6, 7]
[6] [4, 5, 7]
[7] [4, 5, 6]
[4, 5] [6, 7]
[4, 6] [5, 7]
[4, 7] [5, 6]
[5, 6] [4, 7]
[5, 7] [4, 6]
[6, 7] [4, 5]
[4, 5, 6] [7]
[4, 5, 7] [6]
[4, 6, 7] [5]
[5, 6, 7] [4]
1 голос
/ 07 июня 2019

Вот решение, которое не удаляет дубликаты:

from itertools import combinations

a = [4,4,5,6,7]
result = []

for x in range(len(a) + 1):
    for left in combinations(a, x):
        right = a.copy()
        for ele in left:
            right.remove(ele)
        result.append([list(left), right])

for res in result:
    print(res)

Вывод:

[[], [4, 4, 5, 6, 7]]
[[4], [4, 5, 6, 7]]
[[4], [4, 5, 6, 7]]
[[5], [4, 4, 6, 7]]
[[6], [4, 4, 5, 7]]
[[7], [4, 4, 5, 6]]
[[4, 4], [5, 6, 7]]
[[4, 5], [4, 6, 7]]
[[4, 6], [4, 5, 7]]
[[4, 7], [4, 5, 6]]
[[4, 5], [4, 6, 7]]
[[4, 6], [4, 5, 7]]
[[4, 7], [4, 5, 6]]
[[5, 6], [4, 4, 7]]
[[5, 7], [4, 4, 6]]
[[6, 7], [4, 4, 5]]
[[4, 4, 5], [6, 7]]
[[4, 4, 6], [5, 7]]
[[4, 4, 7], [5, 6]]
[[4, 5, 6], [4, 7]]
[[4, 5, 7], [4, 6]]
[[4, 6, 7], [4, 5]]
[[4, 5, 6], [4, 7]]
[[4, 5, 7], [4, 6]]
[[4, 6, 7], [4, 5]]
[[5, 6, 7], [4, 4]]
[[4, 4, 5, 6], [7]]
[[4, 4, 5, 7], [6]]
[[4, 4, 6, 7], [5]]
[[4, 5, 6, 7], [4]]
[[4, 5, 6, 7], [4]]
[[4, 4, 5, 6, 7], []]
0 голосов
/ 07 июня 2019

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

def get_from_0_to_len_minus_1_elements_from_original_list():
    pass # You implement this


list1 = get_from_0_to_len_minus_1_elements_from_original_list()
list2 = [element for element in original_list if element not in list1]
print(list1, list2)

Как разделить исходный список на случайные куски, которые вам решать

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