2012-11-28 3 views
1

у меня есть список словарей, каждый из которых имеет такие данные:Поиск список словарей для имени питона

'Caitlyn': {'date': (2012, 11, 24), 'player': 'Caitlyn', 'outcome': 'Win', 'gameid': '00006', 'stats': {'assists': 6, 'kills': 13, 'deaths': 4}} 

, который я произвожу каждый элемент из файла с линиями и данных, как это:

[00006] Caitlyn - 13/4/6 - Win - 2012-11-24 

Я хочу получить все индексы совпадающего имени игрока в списке словарей и распечатать их и/или распечатать данные в них. Я могу распечатать весь список и отформатировать его в соответствии с моим файлом и т. Д., Но я не уверен, как его искать, поскольку он немного отличается от других поисковых запросов, которые я делаю в этом.

Я могу напечатать весь набор данных с этим (некрасиво, я знаю, но это работает):

i = 0 
for item in records: 
    print "\n", "[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (records[i][0], records[i][1]['player'], records[i][1]['stats']['kills'], records[i][1]['stats']['deaths'], records[i][1]['stats']['assists'], records[i][1]['outcome'], records[i][1]['date'][0], records[i][1]['date'][1], records[i][1]['date'][2]) 
    i = i + 1 

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

[править] Так как, кажется, больше вопросов, то ответы до сих пор, вот весь файл до сих пор: http://www.pasteall.org/37589/python

и это stats4.txt: http://www.pasteall.org/37590

+3

Как и в начале, вы можете использовать перечисление и сэкономить на сохранении отслеживания счетчика приращений, то есть 'for i, item в перечислении (записи):' – BenTrofatter

+1

Список словарей или словарь, содержащий словари? Списки не могут иметь именованные записи (''Caitlyn': {' ...) – Natan

+0

Еще лучше, просто отбросьте счетчик циклов. Внутри цикла 'item - это записи [i]'. Кроме того, что делает поле 'player'? У вас есть дублирующаяся информация. –

ответ

1

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

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

Код должен выглядеть следующим образом.

records = {} 

for line in data: 
    # parsing codes 

    # store player -> gameid mappings to the index 
    if player not in records: 
     records[player] = [] 
    records[player].append(info) 

print records['Sona'] 
# this should print out list of games played with Sona 

Это изменение сделает ваши данные доступными по имени чемпиона, но больше не сортируется по ID игры. Если вам по-прежнему необходимо получить доступ к своим данным по ID игры, я предлагаю вам хранить данные по ID игры и создавать другой словарь для индексации. Это зависит от того, что вы хотите делать с данными.

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

+0

Спасибо, что посмотрю, смогу ли я получить эту работу, как мне нужно :) Да, базы данных, конечно, были бы идеальными, но мне не нужно что-то большое для этого, это всего лишь моя первая небольшая программа для питона :) Я могу написать статистику для файл (и у меня есть еще один файл с именами чемпионов, которые я ищу, чтобы обеспечить ввод чего-то действительного, он также поддерживает сокращения, такие как tf, mf, kog), теперь он просто отображает их, а затем я попытаюсь выполнить некоторое отслеживание и вещи. Еще раз спасибо, я постараюсь разобраться в том, что у меня есть :) – Kassandra

0

ли слишком поздно реструктурировать свои данные?

>>> Caitlyn = {'games': [{'date': (2012, 11, 24), 
         'gameid': '00006', 
         'outcome': 'Win', 
         'stats': {'assists': 6, 'deaths': 4, 'kills': 13}}]} 
>>> game02 = {'date': (2012, 11, 24), 
       'gameid': '00007', 
       'outcome': 'Loss', 
       'stats': {'assists': 4, 'deaths': 3, 'kills': 16}} 
>>> Caitlyn['games'].append(game02) 

Вы можете использовать список словарей для каждого игрока, и сохранить их в свой собственный объект, это соленья хорошо, или он может быть использован как в document-based no-sql database. Хотя это и делает много работы, которую вы сделали до сих пор, выигрыш хорош. Постоянное хранилище, отсутствие синтаксического анализа/записи текста и возможность использовать логику в стиле базы данных, чтобы выполнять поиск, о котором вы говорите. Совокупная статистика - еще один хороший бонус, который приходит на ум. Хотя это не отвечает на ваш вопрос прямо сейчас, надеюсь, вы хотя бы считаете это как вариант.

+0

Я мог бы это сделать, но я новичок в python, и часть того, что я пытаюсь выучить здесь, - это синтаксический анализ и форматирование текста, поэтому я действительно хотел сохранить его в удобной отформатированной фотографии, а затем вырвать данные из этого – Kassandra

+0

Я прочитал ваш комментарий в соответствии с принятым ответом ... базы данных, которые мы оба предложили, основаны на документах, и на самом деле очень быстро устанавливаются и просты в использовании. Определенно держите sqlite3 или mongodb в виду при расширении этой идеи. Кроме того, если вы решите сделать этот сценарий более похожим на программу, попробуйте использовать VCS (git - мой любимый) и начните изучать эти навыки. – Droogans

Смежные вопросы