Использование set в Python внутри цикла - PullRequest
2 голосов
/ 26 марта 2010

У меня есть следующий список в Python:

[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]

Я хочу сгруппировать их в [[1,2,7],[3,4,6,9]]

Мой код для этого выглядит так:

l=[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]
lf=[]
for li in l:
    for lfi in lf:
        if lfi.intersection(set(li)):
            lfi=lfi.union(set(li))
            break
    else:
        lf.append(set(li))

Если мой окончательный список. Я делаю цикл над l и lf, и когда я нахожу пересечение между элементом из l и другим из lf, я хотел бы объединить их (объединение)

Но я не могу понять, почему это не работает. Первые элементы списка l вставляются с помощью команды append, но объединение не работает. Мой окончательный список выглядит как [set([1, 2]), set([3, 4])]

Кажется, что-то довольно простое, но я не знаком с сетами. Я ценю любую помощь

Спасибо

Ответы [ 3 ]

5 голосов
/ 26 марта 2010

Проблема здесь:

lfi=lfi.union(set(li))

Вы не изменяете набор. Вы создаете новый набор, который затем отбрасывается. Исходный набор все еще находится в массиве lf. Вместо этого используйте обновление:

lfi.update(li)

Это изменяет исходный набор вместо создания нового. Результат после внесения этого изменения:

[set([1, 2, 7]), set([9, 3, 4, 6])]
2 голосов
/ 26 марта 2010

Вот еще один способ написать то же самое
Для комплектов
& означает intersection
|= означает update

Я также использовал map(set,l), чтобы вы не воссоздали один и тот же набор снова и снова

l=[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]
lf=[]
for li in map(set,l):
    for lfi in lf:
        if lfi & li:
            lfi |= li
            break
    else:
        lf.append(li)
0 голосов
/ 26 марта 2010
l=[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]
lf=[]
for li in l:
    for i, lfi in enumerate(lf):

        if lfi.intersection(set(li)):
            lfi=lfi.union(set(li))            
            lf[i] = lfi #You forgot to update the list
            break
    else:
        lf.append(set(li))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...