向字典中添加元组形式的列表

2024-10-09 00:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有这样的子列表

[[2013, 'Patric', 'M', 1356], [2013, 'Helena', 'F', 202], [2013, 'Patric', 'F', 6],[1993, 'Patric', 'F', 7]......]

这是一个def list_of_names()的输出,其中2013年是年份,M是性别,1356是M出生数等等

我想创建一个字典,把名字作为键输出,把值作为元组输出(年份,雄性的数量,雌性的数量)。例如:

{ .. ’Patric’:[... , (1993, 0, 7), (2013, 1356, 6), ... ], ... }.

从技术上讲,1993年为年,0为雄数,7为雌数,元组应按年份排列。你知道吗

我被困在如何把这些信息添加到字典里

def name_Index(names):
    d = dict()
    L = readNames() #the list with from previous def which outputs different names and info as above
    newlist = []
    for sublist in L:

Tags: of列表数量字典namesdef名字list
3条回答

这是我试图解决的问题:

from collections import defaultdict, namedtuple
from itertools import groupby

data = [[2013, 'Patric', 'M', 1356],
        [2013, 'Helena', 'F', 202],
        [2013, 'Patric', 'F', 6],
        [1993, 'Patric', 'F', 7]]

names = defaultdict(list)
datum = namedtuple('datum', 'year gender number')
for k, g in groupby(data, key=lambda x: x[1]):
    for l in g:
        year, name, gender, number = l
        names[k].append(datum(year, gender, number))

final_dict = defaultdict(list)
for n in names:
    for k, g in groupby(names[n], lambda x: x.year):
        males = 0
        females = 0
        for l in g:
            if l.gender == 'M':
                males += l.number
            elif l.gender == 'F':
                females += l.number
        final_dict[n].append((k, males, females))

print(final_dict)

最方便的方法是使用collections.defauldict。它返回类似字典的对象,如果找不到键,则返回默认值。在本例中,使用list作为默认值,并在循环中向其附加元组:

from collections import defaultdict

names = [ [2013, 'Patric', 'M', 1356], 
        [2013, 'Helena', 'F', 202], 
        [2013, 'Patric', 'F', 6],
        [1993, 'Patric', 'F', 7]    ]

def name_Index(data):
    # name => year => sex
    d = defaultdict(lambda: defaultdict(lambda: {'F': 0, 'M': 0})) 
    for year, name, sex, births in data:
        d[name][year][sex] += births

    # if you are fine with defauldict result: return d
    # else collect results into tuples:

    result = {}
    for name, data in d.items():
        result[name] = [(year, c['M'], c['F']) for year, c in data.items()]
    return result

    print name_Index(names)
    # {'Helena': [(2013, 0, 202)], 'Patric': [(1993, 0, 7), (2013, 1356, 6)]}
from collections import defaultdict

def list_of_names():
    return [[2013, 'Patric', 'M', 1356],
            [2013, 'Helena', 'F', 202],
            [2013, 'Patric', 'F', 6],
            [1993, 'Patric', 'F', 7]]

def name_Index():
    tmp = defaultdict(lambda:defaultdict(lambda: [0,0]))

    for year, name, sex, N in list_of_names():
        i = 0 if sex == 'M' else 1
        tmp[name][year][i] += N

    d = {}
    for name, entries in tmp.items():
        d[name] = [(year, M, F) for (year, (M,F)) in entries.items()]

    return d

print name_Index()

相关问题 更多 >

    热门问题