Сортировка списков в словаре с использованием данных списков - PullRequest
1 голос
/ 29 апреля 2019

Моя проблема в том, что я пытаюсь отсортировать эти списки в словаре, где я использую имя словаря в качестве имени поля и списки в качестве строк данных.У меня такое ощущение, что я использую неправильный подход (это кортеж или фрейм данных или что?)

Я пытался использовать sorted(), но не могу пройти только сортировку по ключу (например, name, score1, score2).Я хочу поддерживать порядок ключей, но переставлять значения, сохраняя их взаимосвязь между ключами.

Это примерный набор данных, который я хочу отсортировать по score1 (или score2):

scores = {'name': ['joe', 'pete', 'betsy', 'susan', 'pat'], 'score1': [99, 90, 84, 65, 100], 'score2': [85, 91, 90, 55, 98]}

После сортировки по score1 хотелось бы увидеть:

pat, joe, pete, betsy, susan

После сортировки по score1 хотелось бы увидеть:

pat, pete, betsy, joe, susan

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Другой ответ хорош. Вы также можете превратить его в список кортежей, а затем легко отсортировать его:

scores = {
    'name': ['joe', 'pete', 'betsy', 'susan', 'pat'], 
    'score1': [99, 90, 84, 65, 100], 
    'score2': [85, 91, 90, 55, 98]}

t = list(zip(*scores.values()))
print(t)

Выход:

[('joe', 99, 85), ('pete', 90, 91), ('betsy', 84, 90), ('susan', 65, 55), ('pat', 100, 98)]

Тогда вы можете отсортировать это:

# Sort by score1
print(sorted(t, key=lambda x: (x[1]), reverse=True))

# Sort by score2
print(sorted(t, key=lambda x: (x[2]), reverse=True))

# Sort by both scores:
print(sorted(t, key=lambda x: (x[1], x[2]), reverse=True))

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

2 голосов
/ 29 апреля 2019

Если вы создадите scores самостоятельно, будет гораздо проще, если он структурирован по-другому, то есть [{'name': 'joe', 'score1': 1, 'score2': 2}, ...].

Тогда использование sorted довольно просто:

scores = [{'name': 'joe', 'score1': 99, 'score2': 85},
          {'name': 'pete', 'score1': 90, 'score2': 91},
          {'name': 'betsy', 'score1': 84, 'score2': 90},
          {'name': 'susan', 'score1': 65, 'score2': 55},
          {'name': 'pat', 'score1': 100, 'score2': 98}]

by_score_1 = [d['name'] for d in sorted(scores, key=lambda d: d['score1'], reverse=True)]
print(by_score_1)
by_score_2 = [d['name'] for d in sorted(scores, key=lambda d: d['score2'], reverse=True)]
print(by_score_2)

Выходы:

['pat', 'joe', 'pete', 'betsy', 'susan']
['pat', 'pete', 'betsy', 'joe', 'susan']
1 голос
/ 29 апреля 2019

это возможность:

print(sorted(scores['name'], reverse=True, 
             key=lambda x: scores['score1'][scores['name'].index(x)]))
# ['pat', 'joe', 'pete', 'betsy', 'susan']
print(sorted(scores['name'], reverse=True, 
             key=lambda x: scores['score2'][scores['name'].index(x)]))
# ['pat', 'pete', 'betsy', 'joe', 'susan']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...