Найти - Пользователи
Полная версия: сортировка списка по пронумерованному списку кортежей
Начало » Python для новичков » сортировка списка по пронумерованному списку кортежей
1
artemu88
Всем привет!

Есть список чисел:
а = [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)]

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

Большое Всем спасибо!
xam1816
задание не понятно, я так бы сделал
 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)
py.user.next
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 должно получиться в результате.
doza_and
Ну я так понял что Во втором списке надо найти кортеж в котором на первом месте стоит заданное число. Сортировать надо так , чтобы соответствующее второе число возрастало.

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

Не интернет надо перерывать а комбинировать известные вам способы.
например так
 order = dict(b)
a.sort(key=lambda x:order[x])
artemu88
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]
doza_and
artemu88
в котором элементы первого списка идут в том же порядке, что и первые числа в кортеже
Т.е. вторые числа кортежа не используются?
Тоже что и раньше только
 {v[0]:k for k,v in enumerate(b)}
xam1816
тогда вот так
 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]
doza_and
xam1816
тогда вот так
Вижу в вашем алгоритме два минуса.
У него трудоемкость len(a)*len(b)
artemu88
Есть список чисел:

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

Вы делаете не то что требуется в задании. Надо отсортировать существующий список, а вы создаете новый список.
py.user.next
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]
>>>
artemu88
Прошу прощения, вчера уже вечером писал.

Всем спасибо! Разобрался!
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