2015-11-01 3 views
0

Я понимаю, что есть разные способы хранения данных на Python, но я не могу понять, что использовать для моих нужд.Сохранение двух связанных значений в Python

Я сделал небольшую клиентскую/серверную игру, и я хочу, чтобы количество догадок требовало их оценки. Затем я хотел бы написать их имя (в настоящее время IP-адрес) вместе со счетом в файл, чтобы создать список высоких баллов. Хотя я могу сделать это отлично, я хочу только сохранить максимум 5 баллов и иметь возможность сортировать их так, чтобы при отображении высоких баллов и имен пользователю самый низкий (лучший результат) вверху. Я также хотел бы, чтобы имя пользователя существовало более одного раза.

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

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

Что было бы самым простым методом для сохранения имени и оценки без использования какой-либо экстремальной кривой обучения, такой как SQL?

ответ

0

Вы можете сохранить список кортежей с каждым кортежем, содержащим данные в определенном порядке (например. оценка, имя и т. д.). Затем вы можете отсортировать список, используя функцию list.sort(), определив функцию f, чтобы сравнить оценки и передать функцию в sort().

+0

Не могли бы вы привести пример того, как эта функция будет работать? – PairedPrototype

+0

Вы можете посмотреть здесь http://stackoverflow.com/questions/3216398/sorting-by-arbitrary-lambda-in-python. Это напрямую использует лямбда-функцию. – Vinay

+0

Великолепно, я посмотрю. Благодаря! – PairedPrototype

1

Формат с довольно небольшой кривой обучения будет json.

Это в основном словарь, каждый ключ может быть числом, строкой, булевым, float, массивом или другим словарем (может иметь больше типов).

>>> d = {} 
>>> d['someId'] = {'somekey': [0,2,3]} 
>>> d 
{'someId': {'somekey': [0, 2, 3]}} 
>>> d['someId']['somekey'] 
[0, 2, 3] 
>>> d['someId']['number'] = 23456776543 
>>> d['someId']['number'] 
23456776543 

После того, как вы получите повесить json рассмотреть ODM/ORM для Монго.

Или на данный момент, добавьте вспомогательную функцию, чтобы отсортировать по результату, потянув в партитуре и названии.

>>> d = {'user1': {'name': 'howdy', 'score': 11},'user2': {'name': 'howdy2', 'score': 12}} 
>>> d.keys() 
['user2', 'user1'] 
>>> for user_id in d.keys(): 
...  print(d[user_id]['name'], d[user_id]['score']) 
... 
('howdy2', 12) 
('howdy', 11) 

Если его необходимо для установки реляционных данных и модели, то рассмотрим sqlite как это имеет основы, не будучи так сложно настроить как Postgres или MySQL.

Пример json чтение:

Пример json записи:

+0

Я мог бы попробовать это, но возникла бы проблема. Поскольку имя пользователя - это IP, это может происходить несколько раз, поэтому он не может быть основным ключом, если хотите. В настоящее время мне приходится писать 'IP, score'.Но я также сталкивался с другой проблемой, вы не можете писать списки в файл, я должен преобразовать их в строку, сначала, когда вы ее читаете, это все равно строка, и преобразование ее в список будет иметь каждый символ как ценность. Помогло бы, если бы я опубликовал свой код? – PairedPrototype

+0

Я думал, может быть, у меня могло бы быть 5 ключей, то есть чисел 1-5, и использовать это как ключ, поэтому клавиша '1' всегда содержала верхний балл. Но если бы был достигнут новый верхний балл, как бы я подталкивал его значения, чтобы ввести новый верхний балл в ключе '1' и удалить самый низкий балл, чтобы осталось только максимум 5 клавиш? – PairedPrototype

+0

Вы можете написать список в файл 'json', и вместо использования ip в качестве ключа используйте уникальный ключ для идентификации пользователя. Mongo использует идентификатор объекта bson. Если вы хотите, чтобы уникальные ключи были цифрами 1-5, это прекрасно, вы можете это сделать. Чтобы вытащить отсортированный список, вам нужно будет написать вспомогательную функцию, которая сохраняет идентификаторы для минимальных и максимальных значений. Вы можете выполнить это с помощью цикла 1 для цикла. – jmunsch