Помогите с list comprehension python
Как можно "ужать" этот код с помощью List comprehension? Фрагмент который нужно сделать "меньше"
for value in data:
if number[1] < value[1]:
right.append(value)
elif number[1] > value[1]:
left.append(value)
else:
if number[0] == value[0]:
mid.append(value)
elif number[2] != value[2]:
right.append(value) if number[2] > value[2] else left.append(value)
else:
right.append(value) if number[0] > value[0] else left.append(value)
Это весь код:
def quick_sort(data):
mid = []
right = []
left = []
if len(data) < 2:
return data
number = data[len(data) % 2]
for value in data:
if number[1] < value[1]:
right.append(value)
elif number[1] > value[1]:
left.append(value)
else:
if number[0] == value[0]:
mid.append(value)
elif number[2] != value[2]:
right.append(value) if number[2] > value[2] else left.append(value)
else:
right.append(value) if number[0] > value[0] else left.append(value)
return quick_sort(right) + mid + quick_sort(left)
if __name__ == '__main__':
count = int(input())
data = [[-int(player[1]), int(player[2]), player[0]]
for player in [input().split() for _ in range(count)]]
sort_data = quick_sort(data)
print('\n'.join([name[2] for name in sort_data]))
Ответы (2 шт):
Автор решения: Namerek
→ Ссылка
Если прямо вот очень быстро "на коленке"
txt = [
'alla 4 100',
'gena 6 1000',
'gosha 2 90',
'rita 2 90',
'timofey 4 80'
]
txt2 = [
'alla 0 0',
'gena 0 0',
'gosha 0 0',
'rita 0 0',
'timofey 0 0'
]
print(
*[
name for name, *_ in [
item.split() for item in sorted(
txt,
key=lambda x: (-int(x.split()[1]), int(x.split()[2]), x.split()[0]),
)
]
], sep='\n'
)
print('=' * 50)
print(
*[
name for name, *_ in [
item.split() for item in sorted(
txt2,
key=lambda x: (-int(x.split()[1]), int(x.split()[2]), x.split()[0]),
)
]
], sep='\n'
)
#gena
#timofey
#alla
#gosha
#rita
#==================================================
#alla
#gena
#gosha
#rita
#timofey
Если не заморачиваться с однострочниками, то получится наглядней да и условие задачи в котором призывают экономить ресурсы ))) будет ближе к выполнению:
def sort_key(key_field: str):
name, tasks_resolved, mistakes = key_field.split()
# -int(tasks_resolved) Сортируем по числовому значению количества задач в обратном порядке (по убыванию)
# отрицательное значение, нужно для того, чтобы дать возможность сортировать последнее поле (столбец) в алфавитном порядке
# если функции `sorted` задать reverse=True (что будет приемлемо для первых двух полей) то сортировка последнего поля не будет соответствовать условию
# int(mistakes) Сортируем поле количества ошибок по возрастанию в соответствии с условием задачи
# Поле с именем сортируется по условию задачи в алфавитном порядке
return -int(tasks_resolved), int(mistakes), name
print(
*[
name for name, *_ in [
item.split() for item in sorted(
txt,
key=sort_key,
)
]
], sep='\n'
)
Автор решения: SergFSM
→ Ссылка
list comprehension создает новый список, а по условию вашей задачи это делать вроде как нельзя.
Чтобы сортировать "in-place" используйте функцию sort(), в отличии от sorted() она не создает новый список, а сортирует исходный. Например как-то так:
# txt = [input('player >> ') for _ in range(int(input('count >> ')))]
txt = [
'alla 4 100',
'gena 6 1000',
'gosha 2 90',
'rita 2 90',
'timofey 4 80'
]
def f(x):
name, a, b = x.split()
return -int(a), int(b), name # ключи для сортировки
txt.sort(key=f)
for n in txt:
print(n.split()[0])
'''
gena
timofey
alla
gosha
rita
