Как добавить индекс в список списка в Python - PullRequest
0 голосов
/ 02 мая 2018

Я хочу отсортировать список в списке, который у меня есть в данный момент, но это не проблема; я считаю, что я сохранил значения как один индекс в массиве, но мне нужно, чтобы finishTime был отдельным индексом, как я нужно отсортировать массивы по этому значению. Контекст этого кода представляет собой простую форму ввода данных о гонке спортсмена. Код ниже

import time
datasets= []


for i in range(1, 3):
    print("Inputting Data for Lane", i)
    gender = input("Is the athlete male or female ")
    athlete = input("What is the athletes name ")
    finishTime = input("What was the finishing time ")
    dataset = ("Gender =", gender, "|" ,"Athlete =", athlete, "|","Finish time", finishTime)
    datasets.append(dataset)






for s in datasets:
    time.sleep(1)
    print("")
    print(*s)

Это должно выглядеть так

>Male John, 9
>Female Sarah, 7

Как видите, это должны быть два разных индекса, чтобы я мог затем отсортировать списки в списке по номеру в конце.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Используя ваш список списков, используйте либо sort(), чтобы отсортировать список по месту, либо sorted(), чтобы получить новый отсортированный список. Используйте аргумент key для любой функции, чтобы отсортировать последний элемент списка. Если вам нужно отсортировать элементы по наибольшему времени окончания до самого короткого, установите reverse=True:

datasets.sort(key=lambda dataset: float(dataset[-1]), reverse=True)

это позволит отсортировать список на основе числового значения с плавающей запятой последнего элемента каждого вложенного списка. Вы можете предпочесть использовать Decimal с вместо float с, чтобы избежать потери точности, особенно если вам необходимо выполнить вычисления по времени.

Однако я думаю, что вам лучше использовать словарь с именем кортеж или даже обычный кортеж вместо внутреннего списка. Вот пример использования словаря:

datasets = []

for i in range(1, 3):
    dataset = {}
    print("Inputing Data for Lane", i)
    dataset['lane'] = i
    dataset['gender'] = input("Is the athlete male or female ")
    dataset['athlete'] = input("What is the athletes name ")
    dataset['finishTime'] = float(input("What was the finishing time "))
    datasets.append(dataset)

datasets.sort(key=lambda d: d['finishTime'], reverse=True)

for dataset in datasets:
    print('{} {}, {}'.format(dataset['gender'], dataset['athlete'], dataset['finishTime']))
0 голосов
/ 02 мая 2018

Сначала используйте правильную структуру данных - это:

("Gender =", gender, "|" ,"Athlete =", athlete, "|","Finish time", finishTime)

смешивает данные (значения gender, athlete и finishTime) с материалами презентации и практически не используется. Либо просто сохраните значения, например:

 datasets.append((gender, athlete, finishTime))

вы знаете, что для каждой "строки" в datasets, row[0] - это пол, row[1] - это имя, а row[2] - время.

row = datasets[0]
print("Gender : {}".format(row[0]))

или используйте диктовки, если хотите что-то более явное:

 datasets.append(
     {"gender": gender, "athlete": athlete, "finishTime": finishTime}
     )

поэтому для каждой строки вы можете получить значения по ключу вместо индекса:

row = datasets[0]
print("Gender : {}".format(row["gender"]))

Тогда вы наверняка захотите сделать finsihTime целым числом - input() возвращает строку, а строка не сортируется так же, как целые числа:

>>> lst = ["15", "2", "21", "3"]
>>> sorted(lst)
['15', '2', '21', '3']

>>> lst2 = [15, 2, 31, 3]
>>> sorted(lst2)
[2, 3, 15, 31]

Тогда вам нужно только передать соответствующую функцию обратного вызова key в sorted(). Если вы используете кортежи:

>>> datasets
[('male', 'foo', 15), ('female', 'bar', 11)]

>>> sorted(datasets, key=lambda row: row[2])
[('female', 'bar', 11), ('male', 'foo', 15)]

Если вы используете дикты:

>>> datasets
[{'gender': 'male', 'athlete': 'foo', 'finishTime': 15}, {'gender': 'female', 'athlete': 'bar', 'finishTime': 11}]
>>> sorted(dataset, key=lambda row: row["finishTime"])
[{'gender': 'female', 'athlete': 'bar', 'finishTime': 11}, {'gender': 'male', 'athlete': 'foo', 'finishTime': 15}]
0 голосов
/ 02 мая 2018
import time
datasets= []


for i in range(0, 3):
    print("Inputting Data for Lane", i)
    gender = str(input("Is the athlete male or female ")) # female|male check missing...
    athlete = str(input("What is the athletes name "))
    finishTime = str(input("What was the finishing time "))
    dataset = [gender, athlete, finishTime]
    datasets.append(dataset)





print("{0:<10}{1:<10}{2:<15}".format("Gender","Athlete","Finish time"))

ds = sorted(datasets, key=lambda x:x[2], reverse=False)

for s in ds:
    time.sleep(1)
    print("{0:<10}{1:<10}{2:<15}".format(s[0], s[1], s[2]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...