Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 19, 2015 11:02:16

miko2009
Зарегистрирован: 2015-12-19
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка списков

Доброго дня ! у меня такая проблема , пару дней пытаюсь сравнить два списка

a=['a','a','b','b','d','d','a','d']
b=['1','1','1','3','3','2','2','1']
суть задачи такая, список “b” это список классов(их имена), а список “а” это список экземпларов класса с именами. Списки заполняются последовательно с созданием нового объекта путем добавление в конец списка(обоих списков ).Теперь вопрос как сделать так:
a=['a','a','b','d','b','d','d','a']
b=['1','1','1','1','3','3','2','2']
тоесть отсортировать список “b” так что бы найти все повторяющиеся элементы и выставить их по порядку , находит 1 и идет поиск всех единиц , потом следущий член списка, это проблема решаемая и я ее решил при помощи цикла for и while но вот что делать со списком “a” не представляю, нужно что бы и этот список унаследовал порядок сортировки каждого члена списка “b”, например если:
значение
b[4]
стало в новом списке
z[6]
, то и
a[4]
в новом списке должно стать
y[6]
. Смотрел в сторону set но что то глухо , через lamda тоже не могу придумать функцию.

Отредактировано miko2009 (Дек. 19, 2015 11:04:50)

Офлайн

#2 Дек. 19, 2015 12:34:07

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

сортировка списков

>>> class T: pass
>>> a = T()
>>> a.__class__
<class '__main__.T'>
>>> a.__class__.__name__
'T'

Офлайн

#3 Дек. 19, 2015 12:39:03

miko2009
Зарегистрирован: 2015-12-19
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка списков

а для новичка не могли бы расшифровать

Офлайн

#4 Дек. 19, 2015 12:39:20

shaptmos
Зарегистрирован: 2015-12-12
Сообщения: 27
Репутация: +  4  -
Профиль   Отправить e-mail  

сортировка списков

Я.честно говоря, ничего половину не понял, но что сказать имею

1. Есть ли необходимость в том, чтобы сортировка в списке b была бы именно по порядку? ну то есть, в данном случае или можно все решить просто банальной сортировкой (l.sort() or sorted())
2. Чтобы порядок следования сохранялся надо данные связать, наверное, как то так:

a=['a','a','b','b','d','d','a','d']
b=['1','1','1','3','3','2','2','1']
new_list = [(c,d) for c,d in zip(b,a)]
new_list.sort()
y = [arg[1] for arg in new_list]
z = [arg[0] for arg in new_list]

Офлайн

#5 Дек. 19, 2015 12:57:12

miko2009
Зарегистрирован: 2015-12-19
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка списков

1. ну желательно что бы не по порядку 123456 а именно как они возникают в списке , тоесть может быть целая туча 29 а потом пару 4, и желательно что бы и в списке они попали именно в порядке появления, тоесть сначала все 29 а потом все 4.
2. щя буду тестить
P.s. смысл в том что бы унаследовать порядок сортировки значений списка класса “b” в список “a”, как то так

Офлайн

#6 Дек. 19, 2015 15:00:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

сортировка списков

miko2009
суть задачи такая, список “b” это список классов(их имена), а список “а” это список экземпларов класса с именами.
miko2009
а для новичка не могли бы расшифровать
Если новичок, то вряд ли это метапрограммирование. А если это не метапрограммирование, то это неправильный подход.

miko2009
1. ну желательно что бы не по порядку 123456 а именно как они возникают в списке
Там надо брать пары и перекидывать их в новый список, выбирая подходящие. То есть сортировка не подойдёт.

1. Берёшь пару соответствующих элементов.
2. Добавляешь её в выходной список.
3. Начинаешь выборку пар, равных по второму элементу:
3.1. Справа от исходной пары берёшь очередную пару.
3.2. Если вторые элементы пар равны, добавляешь взятую пару в выходной список.
4. Пропускаешь пары справа, пока вторые элементы равны.
5. Переходишь к пункту 1.



Отредактировано py.user.next (Дек. 19, 2015 15:02:12)

Офлайн

#7 Дек. 19, 2015 15:22:01

miko2009
Зарегистрирован: 2015-12-19
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка списков

я сделал как указал shaptmos, выполнил сет двух списков, отсортировал как мне нужно , и далее извлек первый arg в один список , а второй arg в другой. Все (как я и думал) очень просто по крайней мере получил нужный результат …..
P.S. я новичок в программировании (пару месяцев) но решаю серьезные задачи из области конструирования сложных инженерных объектов в РФ, дописываю мини программы под определенную программу (Autodesk Revit) в основном все завязано на численных методах, комбинаторики. У меня уже есть мне доступные классы , а далее я с ними провожу манипуляции , поэтому и возникают такие вопросы как этот. Никакого метапрограммирования

Офлайн

#8 Дек. 19, 2015 17:40:03

miko2009
Зарегистрирован: 2015-12-19
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка списков

вторая часть вопроса

a=[2, 1, 2, 2, 1, 4]
b=[2, 6, 4]
c=list()
i=0
j=0
for z1 in b:
    for z2 in a:
        if b[j]==(sum (a[j:i+1])):
            c.append(i+1)
        i=i+1
    j=j+1
print(c)
а по идее должен получить
с=[1,4,1]
почему то второй проход по j не проходит

Офлайн

#9 Дек. 19, 2015 17:51:07

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

сортировка списков

miko2009
а для новичка не могли бы расшифровать
Могу. Питоновские объекты содержат информацию об их принадлежности к классам. Но в случае если речь шла не об питоновских классах с объектами, полезная информация всё равно присутствовала: хранить пару в едином объекте.

Офлайн

#10 Дек. 19, 2015 18:31:58

shaptmos
Зарегистрирован: 2015-12-12
Сообщения: 27
Репутация: +  4  -
Профиль   Отправить e-mail  

сортировка списков

почему то второй проход по j не проходит
ну почему не проходит, очень даже проходит.
выводятся sum и номер прохождения первого цикла:

a=[2, 1, 2, 2, 1, 4]
b=[2, 6, 4]
c=list()
i=0
j=0
cycle = 0
for z1 in b:
    for z2 in a:
        print(sum(a[j:i+1]))
        if b[j]==(a[j:i+1]):
            c.append(i+1)
        i=i+1
    j=j+1
    cycle +=1
    print('cycle', cycle)
print(c)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version