Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 3, 2021 21:20:24

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

сортировка списка по пронумерованному списку кортежей

Всем привет!

Есть список чисел:

а = [2, 2, 2, 3, 3, 6, 7, 7, 10, 5]
который нужно отсортировать по номеру кортежа в списку кортежей (первый элемент в кортеже):
b = [(4, 8), (3, 13), (10, 17), (8, 20), (6, 29), (5, 38), (9, 56), (7, 58), (2, 64), (1, 79)]

Подскажите, как это сделать? Весь инет перерыл.

Большое Всем спасибо!

Отредактировано artemu88 (Авг. 3, 2021 21:21:45)

Офлайн

#2 Авг. 3, 2021 22:07:55

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1355
Репутация: +  119  -
Профиль   Отправить e-mail  

сортировка списка по пронумерованному списку кортежей

задание не понятно, я так бы сделал

 a = [2, 2, 2, 3, 3, 6, 7, 7, 10, 5]
b = [(4, 8), (3, 13), (10, 17), (8, 20), (6, 29), (5, 38), (9, 56), (7, 58), (2, 64), (1, 79)]
out = []
for i in a:# для каждого элемента из списка а
	for j in b:# для каждого кортежа из списка b
		if i == j[0]:# если текущий элемент из списка а равен первому элементу из текущего кортежа списка b
			out.append(j[1])# добавить в итоговый список второй элемент текущего кортежа
print(out)

Офлайн

#3 Авг. 4, 2021 02:13:39

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

сортировка списка по пронумерованному списку кортежей

artemu88
который нужно отсортировать по номеру кортежа
Приведи пример для
artemu88
  
a = [2, 2, 2, 3, 3, 6, 7, 7, 10, 5]
b = [(4, 8), (3, 13), (10, 17), (8, 20), (6, 29), (5, 38), (9, 56), (7, 58), (2, 64), (1, 79)]
Что из этих a и b должно получиться в результате.



Отредактировано py.user.next (Авг. 4, 2021 02:13:53)

Офлайн

#4 Авг. 4, 2021 07:54:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

сортировка списка по пронумерованному списку кортежей

Ну я так понял что Во втором списке надо найти кортеж в котором на первом месте стоит заданное число. Сортировать надо так , чтобы соответствующее второе число возрастало.

artemu88
Подскажите, как это сделать? Весь инет перерыл.

Не интернет надо перерывать а комбинировать известные вам способы.
например так
 order = dict(b)
a.sort(key=lambda x:order[x])



Офлайн

#5 Авг. 4, 2021 08:37:09

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

сортировка списка по пронумерованному списку кортежей

py.user.next
Что из этих a и b должно получиться в результате.
В результате должен получиться список, в котором элементы первого списка идут в том же порядке, что и первые числа в кортеже:
а = [2, 2, 2, 3, 3, 6, 7, 7, 10, 5]

b = [(4, 8), (3, 13), (10, 17), (8, 20), (6, 29), (5, 38), (9, 56), (7, 58), (2, 64), (1, 79)]

результат = [3, 3 ,10, 5, 7, 7, 2, 2, 2]

Отредактировано artemu88 (Авг. 4, 2021 08:37:19)

Офлайн

#6 Авг. 4, 2021 11:07:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

сортировка списка по пронумерованному списку кортежей

artemu88
в котором элементы первого списка идут в том же порядке, что и первые числа в кортеже
Т.е. вторые числа кортежа не используются?
Тоже что и раньше только
 {v[0]:k for k,v in enumerate(b)}



Офлайн

#7 Авг. 4, 2021 13:20:31

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1355
Репутация: +  119  -
Профиль   Отправить e-mail  

сортировка списка по пронумерованному списку кортежей

тогда вот так

 a = [2, 2, 2, 3, 3, 6, 7, 7, 10, 5]
b = [(4, 8), (3, 13), (10, 17), (8, 20), (6, 29), (5, 38), (9, 56), (7, 58), (2, 64), (1, 79)]
c = []
for i in a:
	for j in b:
		if i == j[0]:
			c.append(j)# выбираю сюда все кортежи,которые соответствуют списку а
d = sorted(c,key=lambda i:i[1]) #сортирую список по значениям
out = [i[0] for i in d]#вывожу в список первые элементы кортежа из отсортированного списка
print(out)

вывод
 [3, 3, 10, 6, 5, 7, 7, 2, 2, 2]

Офлайн

#8 Авг. 4, 2021 14:14:42

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

сортировка списка по пронумерованному списку кортежей

xam1816
тогда вот так
Вижу в вашем алгоритме два минуса.
У него трудоемкость len(a)*len(b)
artemu88
Есть список чисел:

который нужно отсортировать…

Вы делаете не то что требуется в задании. Надо отсортировать существующий список, а вы создаете новый список.



Офлайн

#9 Авг. 4, 2021 14:15:38

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

сортировка списка по пронумерованному списку кортежей

artemu88
который нужно отсортировать по номеру кортежа в списку кортежей (первый элемент в кортеже)
xam1816
задание не понятно
doza_and
Ну я так понял что Во втором списке надо найти кортеж в котором на первом месте стоит заданное число.
artemu88 , ты неправильно выражаешься. Первый элемент в кортеже (a, b) - это элемент a, а не элемент b. А элемент b - это второй элемент в кортеже. Так вот индекс первого элемента в кортеже равен нулю, а индекс второго элемента в кортеже равен единице. Элемент в кортеже и индекс элемента в кортеже - это разные понятия, это не одно и то же. Поэтому тебя не понимают. Выражайся, как все.

Значит, тебе нужно отсортировать первый список a по вторым элементам кортежей из второго списка b, сопоставляя элементы первого списка a с первыми элементами кортежей из второго списка b.

  
>>> def f(a, b):
...     t = dict(b)
...     out = [x for _, x in sorted((t.get(i), i) for i in a)]
...     return out
... 
>>> a = [2, 2, 2, 3, 3, 6, 7, 7, 10, 5]
>>> b = [(4, 8), (3, 13), (10, 17), (8, 20), (6, 29), (5, 38), (9, 56), (7, 58), (2, 64), (1, 79)]
>>> 
>>> f(a, b)
[3, 3, 10, 6, 5, 7, 7, 2, 2, 2]
>>>



Офлайн

#10 Авг. 4, 2021 14:19:43

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

сортировка списка по пронумерованному списку кортежей

Прошу прощения, вчера уже вечером писал.

Всем спасибо! Разобрался!

Отредактировано artemu88 (Авг. 4, 2021 14:21:45)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version