Объединить список вместе на основе общих значений - PullRequest
0 голосов
/ 05 декабря 2018

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

a = [(1,2),(1,3),(4,5),(6,7),(8,7)]

Я хочу объединить значения в списках в группы, чтобы я мог получить:

b = [(1,2,3),(4,5),(6,7,8)]

Порядок не имеет значения, ногруппа на основе вопросов подключения.Не удалось найти способ сделать это, любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

некоторые для циклов сделают работу:

a = [(1,2),(1,3),(4,5),(6,7),(8,7)]

unions = [[i1,i2]  for i1,x in enumerate(a) for i2,y in enumerate(a) for z in x if z in y and i2!=i1]

for c in unions:
    if c[::-1] in unions: unions.remove(c[::-1])

b = [e for i,e in enumerate(a) if i not in [y for x in unions for y in x]]

for c in unions:b.append(tuple(set(a[c[0]]+a[c[1]])))

print sorted(b)
0 голосов
/ 05 декабря 2018

Вы можете использовать пересечение наборов, чтобы проверить, есть ли какое-либо общее значение между двумя наборами, и вы можете использовать объединение наборов, чтобы объединить два набора:

b = []
for p in map(set, a):
    for i, s in enumerate(b):
        if s & p:
            b[i] |= p
            break
    else:
        b.append(p)

b становится:

[{1, 2, 3}, {4, 5}, {8, 6, 7}]

Затем вы можете преобразовать его в нужный список отсортированных кортежей, если хотите:

b = [tuple(sorted(s)) for s in b]

b становится:

[(1, 2, 3), (4, 5), (6, 7, 8)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...