Найти - Пользователи
Полная версия: Создать списки в цикле
Начало » Python для новичков » Создать списки в цикле
1 2
EvgenKlim
Доброго времени суток!

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

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

Помогите пожалуйста разобраться что не правильно делаю. Спасибо!
Shaman
...
        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 нет второго элемента
EvgenKlim
Но разве append не добавляет новый элемент в конец списка?
Shaman
EvgenKlim
Но разве append не добавляет новый элемент в конец списка?
[[['dr101', 'mr99'], ['dr101', 'out00']]]
О каком из этих списков речь?
EvgenKlim
Возможно я неправильно объяснил.

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

Т.е. дан
["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"]
и т.д.
но как это сделать даже не знаю
Shaman
Надо бы курить кластеризацию графов.
EvgenKlim
Мда уж, глупейшая ошибка, сразу не заметил(

Теперь работает.
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, спасибо за совет, но это для меня пока еще рано
Shaman
Уверен в правильности работы? Какую роль играет сортировка n.sort() ?
Shaman
У меня получилось что-то такое:
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)
EvgenKlim
Shaman
Вроде правильно работает, по крайней мере выдает то что нужно) Если и есть какие-н ошибки, то я их не вижу. Сортировка уже лишняя, забыл удалить.

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

“|” это OR, но как понять “|=” ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB