Есть ли более эффективный способ перебора списка словарей? - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь перебрать список словарей и сохранить в ключе yearID только те из них, у которых есть значение года. По сути, список (statistics) - статистика бейсбола, а каждая строка (словарь) - статистика игрока за год.

Этот код, кажется, работает очень хорошо (для ОЧЕНЬ небольших списков словарей), но, как только размер списка становится больше 40 или 50, Тонни разбивает:

def filter_by_year(statistics, year, yearid):

    nlist = []
    for dicts in statistics:
        if str(dicts[yearid]) == str(year):
            nlist.append(dicts)

    return nlist

Ответы [ 5 ]

1 голос
/ 14 мая 2019

Из всех методов, представленных до сих пор ( prashant rana , Zaid Afzal , alec_a и Steven Burnap ), ваш- оригинальный - самый эффективный.Это становится несколько 3x быстрее, если вы исключите ненужное преобразование в строки:

def filter_by_year(statistics, year, yearid): 
    nlist = [] 
    for dicts in statistics: 
        if dicts[yearid] == year: 
            nlist.append(dicts) 
    return nlist 
1 голос
/ 14 мая 2019

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

В этом случае nlist можно упростить до простого понимания списка:

[dicts for dicts in statistics if str(dicts[yearid]) == str(year)]
1 голос
/ 14 мая 2019

Понятия не имею, если это более эффективно, но понимание списка - более чистый код:

return [dicts for dicts in statistics if str(dicts[yearid]) == str(year)]
0 голосов
/ 14 мая 2019

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

def filter_by_year(statistics, year, yearid):

    nlist = []

    for i, yearid_ in enumerate(dict[yearid] for dict in statistics): 
        if str(yearid_) == str(year):
            nlist.append(statistics[i])

    return nlist
0 голосов
/ 14 мая 2019

A filter также может быть хорошим способом

def filter_by_year(statistics, year, yearid):
    nlist = list(filter (lambda dicts: str(dicts[yearid]) == str(year), statistics))
    return nlist
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...