【问题标题】:Tranforming multi value dictionary keys to list将多值字典键转换为列表
【发布时间】:2017-08-14 07:59:23
【问题描述】:

我的输入是一个字典,其值如下:
{0:'205,3',1:'0,110,18,49,8',10:'11,73'} 不幸的是,您可以看到字典的值是字符串''。 我的预期结果是这样的
[(0,205),(0,3),(1,0),(1,110),(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).. ...] 我怎样才能绕过这个问题,并将值作为整数而不是一位数?

【问题讨论】:

  • 请与我们分享您的代码。
  • hfg怎么了?

标签: python dictionary key


【解决方案1】:

您可以使用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']}

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

如果你想去掉每个值中的[],你可以使用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,它具有相同的键,但它的值是逗号分隔的。

【讨论】:

  • 没错,这是我得到的输出,但是当我想打印时,每个值中仍然有 [' '] !我怎样才能摆脱它?
  • @GeorgeKladis 我用您的格式问题的可能解决方案编辑了我的答案。
  • 谢谢你摇滚!正是我需要的格式!作为代码的问题,operator -> 做了什么,以及这个新函数 (join_lists) 如何将 result_dict 作为参数而不调用使用它的函数?
  • @GeorgeKladis -> 只是一个函数注释。它描述了每个函数参数的类型(我使用它是因为函数参数变得不言自明。它说:join_lists 函数接受两个参数:d,这是一个dict,和一个可选的sep,它是一个str。该函数返回一个dict类型的值)。哦,函数中带有result_dict 是我的愚蠢错误。我没有看到它,因为它都在一个文件中,这就是它起作用的原因。我会立即编辑我的答案。 :)
【解决方案2】:

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

所以应该这样做

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

这当然会删除元组中稍后出现的第二项。我没有看到你指定你想用它做什么

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2019-05-05
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多