从dict中的列表中过滤特定元素

时间:2017-09-24 01:29:55

标签: python python-3.x

我想将列表作为字典的一个键的值过滤,并将列表中的元素转换为int。列表中的元素可能包含' ... 我有一些愚蠢的代码如下,但如何有更多的pythonic方式或一行来做它?

def fil(d:dict):
    rtn = dict()
    for k, v in d.items():
        rtn[k] = [int(x) for x in v if x and x != '...']
    return rtn

d = dict( name=['1', '2', '3', '4', '5'], state=['21', '', '22', '...', '23'], number=['11', '...', '12', '13'])
print(fil(d))

2 个答案:

答案 0 :(得分:0)

通过使用字典理解以及列表理解,你当然可以将它减少到一行:

{k:[int(x) for x in v if x and x != '...'] for k,v in d.items()}

另一种方法是将列表转换定义为函数,然后编写{k:fil(v) for k,v in d.items()}来说明可分离的字典和列表处理(并且不会感觉像是满口)。

答案 1 :(得分:0)

如果你正在寻找一种“pythonic”方式,我会说你所拥有的很好。

如果您正在寻找单行,那么也许:

>>> def fil(d):
        return {k: [int(x) for x in v if x and x != '...'] for k, v in d.items()}

>>> d = dict( name=['1', '2', '3', '4', '5'], state=['21', '', '22', '...', '23'], number=['11', '...', '12', '13'])
>>> print (fil(d))
{'name': [1, 2, 3, 4, 5], 'state': [21, 22, 23], 'number': [11, 12, 13]}
>>> 

这归结为你所定义的“pythonic”。理解通常被认为是相当“pythonic”,这是字典complehnsion中的列表理解!

那就是说,如果函数符合PEP标准,在语法上是正确的,并且很容易被另一个程序员审查以确定其目的,为什么要改变它呢?

另外请注意,除非您按下params中的typing语法,否则请将其删除。