有没有更有效的方法来遍历字典列表?

时间:2019-05-13 21:08:03

标签: python list dictionary iteration

我试图遍历字典列表,并仅将具有年份值的字典保留在其yearID键中。本质上,列表(statistics)是棒球统计数据,每一行(词典)都是一年中球员的统计数据。

此代码似乎很好用(对于很小的词典列表),但是一旦列表的大小超过40或50,Thonny就会崩溃:

def filter_by_year(statistics, year, yearid):

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

    return nlist

5 个答案:

答案 0 :(得分:1)

我不知道它是否更有效,但是列表理解是更简洁的代码:

return [dicts for dicts in statistics if str(dicts[yearid]) == str(year)]

答案 1 :(得分:1)

取决于您所说的“有效”。您的代码对于大量词典应该可以正常工作,所以我认为您的意思是编写代码很有效。

在这种情况下,nlist可以简化为简单的列表理解:

[dicts for dicts in statistics if str(dicts[yearid]) == str(year)]

答案 2 :(得分:1)

到目前为止介绍的所有方法中(由 prashant rana Zaid Afzal alec_a Steven Burnap >),您的-原始的-效率最高。如果您消除了不必要的字符串转换,则速度会提高 3倍

def filter_by_year(statistics, year, yearid): 
    nlist = [] 
    for dicts in statistics: 
        if dicts[yearid] == year: 
            nlist.append(dicts) 
    return nlist 

答案 3 :(得分:0)

filter也是一个好方法

def filter_by_year(statistics, year, yearid):
    nlist = list(filter (lambda dicts: str(dicts[yearid]) == str(year), statistics))
    return nlist

答案 4 :(得分:0)

您可以使用生成器仅获取年份并保持字典索引的迭代。

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