转换要列出的多值字典键

时间:2017-08-14 07:59:23

标签: python dictionary key

我的输入是一个字典,其值如下:
{0:' 205,3',1:' 0,110,18,49,8',10:' 11,73'} 不幸的是,您可以看到字典的值是字符串''。 我的预期结果有点像这样 [(0205),(0,3),(1,0),(1110),(1,18).....]
我的代码如下。

def generate_edges(newDict):                                   
    edges = []
    for node in newDict:
        for neighbour in newDict[node]:
            if neighbour == ',':
                continue
            else:
                edges.append((node, int(neighbour)))
    print(edges)
    return edges

问题在于,正如您所看到的,表示为数字的数字逐位减少,结果为:
[(0,2),(0,0),(0,5),(0,3),(1,0),(1,1),(1,1),(1,0).. ...] 我如何规避这个问题并将值作为整数而不是一位数?

2 个答案:

答案 0 :(得分:0)

您可以使用collections.defaultdict并创建defaultdict(list)

正如the docs中所述:

  

第一次遇到每个密钥时,它不在映射中;因此,使用default_factory函数自动创建一个条目,该函数返回一个空列表。然后list.append()操作将值附加到新列表。

因此,您可以轻松构建所需的词典:

from collections import defaultdict


l = [(2009, 'abc'), (2010, 'dfg'), (2009, 'hfg'), (2011, 'kdi')]

result = defaultdict(list)

for pair in l:
    result[pair[0]].append(pair[1])

print(result)  # {2009: ['abc', 'hfg'], 2010: ['dfg'], 2011: ['kdi']}

您只需遍历列表中的每个元组并将其附加到字典中。

如果您想摆脱每个值中的[],可以使用str.join()

...

def join_lists(d: dict, sep: str=', ') -> dict:
    return {key: sep.join(values) for key, values in d.items()}

print(join_lists(result_dict))  # {2009: 'abc, hfg', 2010: 'dfg', 2011: 'kdi'}

我实现了一个名为join_lists()的函数,它接受一个字典作为第一个参数,一个可选的分隔符作为第二个参数(默认为", ")。这些函数返回一个 new dict,它具有相同的键,但它的值是逗号分隔的。

答案 1 :(得分:0)

看起来你只想要键的第一个值,键是年份

所以这应该这样做

result = dict()
for year, value in your_list:
    if year not in result:
    result[year] = value

这当然会丢弃元组中第二个项目的后期出现。我没有看到你指定你想用它做什么