Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 18, 2014 12:06:34

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать списки в цикле

Доброго времени суток!

Не получается создать новые списки на основе текущего.
Правило разбиения на списки простое: дан громадный список ветвей дерева: Петя-Маша, Маша-Даша, Юстас-Алекс, Маша-Вася, Вася-Борис и т.п…. Нужно создать списки уникальных имен при условии что они принадлежат одному дереву, т.е. связаны через последовательность имен. Например в данном случае Петя находится в одном дереве с Борисом, т.к. можно составить цепь Петя-Маша-Вася-Борис. Также в данном случае этот список будет следующим

[Петя, Маша, Даша, Вася, Борис]
, их последовательность не важна в списке, главное что они связаны между собой через других людей, т.е. имеют общих знакомых

Этот код выдает ошибку…
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)

Офлайн

#2 Июнь 18, 2014 12:42:31

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Создать списки в цикле

...
        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
-выход за пределы new
...
        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
-в new нет второго элемента

Отредактировано Shaman (Июнь 18, 2014 12:46:36)

Офлайн

#3 Июнь 18, 2014 12:56:12

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать списки в цикле

Но разве append не добавляет новый элемент в конец списка?

Офлайн

#4 Июнь 18, 2014 12:57:57

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Создать списки в цикле

EvgenKlim
Но разве append не добавляет новый элемент в конец списка?
[[['dr101', 'mr99'], ['dr101', 'out00']]]
О каком из этих списков речь?

Офлайн

#5 Июнь 18, 2014 13:29:22

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать списки в цикле

Возможно я неправильно объяснил.

Мне нужно чтобы основной список разбивался на несколько подсписков

Т.е. дан

["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"]]

Либо как то создавать одномерные списки

new1=
["dr101", "mr99", "out00"]
new2=
["scout1", "scout2", "scout3", "scout4", "sscout", "super"]
и т.д.
но как это сделать даже не знаю

Отредактировано EvgenKlim (Июнь 18, 2014 13:29:45)

Офлайн

#6 Июнь 18, 2014 13:41:59

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Создать списки в цикле

Надо бы курить кластеризацию графов.

Офлайн

#7 Июнь 19, 2014 11:28:09

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать списки в цикле

Мда уж, глупейшая ошибка, сразу не заметил(

Теперь работает.

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

Shaman, спасибо за совет, но это для меня пока еще рано

Офлайн

#8 Июнь 19, 2014 12:12:02

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Создать списки в цикле

Уверен в правильности работы? Какую роль играет сортировка n.sort() ?

Офлайн

#9 Июнь 19, 2014 15:30:35

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Создать списки в цикле

У меня получилось что-то такое:

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)

Офлайн

#10 Июнь 20, 2014 07:24:23

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать списки в цикле

Shaman
Вроде правильно работает, по крайней мере выдает то что нужно) Если и есть какие-н ошибки, то я их не вижу. Сортировка уже лишняя, забыл удалить.

Что делает оператор “|=” ?Не могу найти описание

“|” это OR, но как понять “|=” ?

Отредактировано EvgenKlim (Июнь 20, 2014 07:30:13)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version