Форум сайта python.su
0
Доброго времени суток!
Не получается создать новые списки на основе текущего.
Правило разбиения на списки простое: дан громадный список ветвей дерева: Петя-Маша, Маша-Даша, Юстас-Алекс, Маша-Вася, Вася-Борис и т.п…. Нужно создать списки уникальных имен при условии что они принадлежат одному дереву, т.е. связаны через последовательность имен. Например в данном случае Петя находится в одном дереве с Борисом, т.к. можно составить цепь Петя-Маша-Вася-Борис. Также в данном случае этот список будет следующим
[Петя, Маша, Даша, Вася, Борис]
n=["dr101-mr99", "mr99-out00", "dr101-out00", "scout1-scout2", "scout3-scout1", "scout1-scout4", "scout4-sscout", "sscout-super"] new=[[]] st="" n.sort() isp=0 while n!=[]: st=n[0] st=st.split("-") print isp new[-1].append(st) n.remove(n[0]) deleted=0 for i in range(len(n)): st=n[i-deleted] st=st.split("-") if (st[0] in new[isp]) and (st[1] not in new[isp]): new[isp].append(st[1]) del n[i-deleted] deleted+=1 elif (st[1] in new[isp]) and (st[0] not in new[isp]): new[isp].append(st[0]) del n[i-deleted] deleted+=1 elif (st[0] in new[isp]) and (st[1] in new[isp]): del n[i-deleted] deleted+=1 isp+=1 print new print n
Отредактировано EvgenKlim (Июнь 18, 2014 12:08:57)
Офлайн
88
... print st[0] print st[1] print new[isp] if (st[0] in new[isp]) and (st[1] not in new[isp]): new[isp].append(st[1]) del n[i-deleted] deleted+=1 ...
Traceback (most recent call last): File "/home/buser/projects/tree.py", line 19, in <module> print new[isp] IndexError: list index out of range
... print isp print new[isp] if (st[0] in new[isp]) and (st[1] not in new[isp]): new[isp].append(st[1]) del n[i-deleted] deleted+=1 ...
0 [['dr101', 'mr99']] 1 Traceback (most recent call last): File "/home/buser/projects/tree.py", line 18, in <module> print new[isp] IndexError: list index out of range
Отредактировано Shaman (Июнь 18, 2014 12:46:36)
Офлайн
0
Но разве append не добавляет новый элемент в конец списка?
Офлайн
88
EvgenKlim
Но разве append не добавляет новый элемент в конец списка?
[[['dr101', 'mr99'], ['dr101', 'out00']]]
Офлайн
0
Возможно я неправильно объяснил.
Мне нужно чтобы основной список разбивался на несколько подсписков
Т.е. дан
["dr101-mr99", "mr99-out00", "dr101-out00", "scout1-scout2", "scout3-scout1", "scout1-scout4", "scout4-sscout", "sscout-super"]
[["dr101", "mr99", "out00"], ["scout1", "scout2", "scout3", "scout4", "sscout", "super"]]
["dr101", "mr99", "out00"]
["scout1", "scout2", "scout3", "scout4", "sscout", "super"]
Отредактировано EvgenKlim (Июнь 18, 2014 13:29:45)
Офлайн
88
Надо бы курить кластеризацию графов.
Офлайн
0
Мда уж, глупейшая ошибка, сразу не заметил
(
Теперь работает.
n=["dr101-mr99", "mr99-out00", "dr101-out00", "scout1-scout2", "scout3-scout1", "scout1-scout4", "scout4-sscout", "sscout-super"] new=[] st="" n.sort() isp=0 while n!=[]: st=n[0] st=st.split("-") new.append(st) n.remove(n[0]) deleted=0 for i in range(len(n)): st=n[i-deleted] st=st.split("-") if (st[0] in new[isp]) and (st[1] not in new[isp]): new[isp].append(st[1]) del n[i-deleted] deleted+=1 elif (st[1] in new[isp]) and (st[0] not in new[isp]): new[isp].append(st[0]) del n[i-deleted] deleted+=1 elif (st[0] in new[isp]) and (st[1] in new[isp]): del n[i-deleted] deleted+=1 isp+=1 print new print n
Офлайн
88
Уверен в правильности работы? Какую роль играет сортировка n.sort() ?
Офлайн
88
У меня получилось что-то такое:
pairs=["dr101-mr99", "mr99-out00", "dr101-out00", "zcout1-scout2", "scout3-zcout1", "zcout1-scout4", "scout4-sscout", "sscout-super"] def get_friendship(pl): def do_pass(res, pl): for p in pl: found = False for s in res: if not p.isdisjoint(s): s |= p found = True if not found: res.append(p) return found res = [] while do_pass(res, pl): pl, res = res, [] return res print get_friendship(set(p.split('-')) for p in pairs)
Отредактировано Shaman (Июнь 19, 2014 15:33:43)
Офлайн
0
Shaman
Вроде правильно работает, по крайней мере выдает то что нужно) Если и есть какие-н ошибки, то я их не вижу. Сортировка уже лишняя, забыл удалить.
Что делает оператор “|=” ?Не могу найти описание
“|” это OR, но как понять “|=” ?
Отредактировано EvgenKlim (Июнь 20, 2014 07:30:13)
Офлайн