繁体   English   中英

Python 字典初始化和值 append 要列出

[英]Python dictionary initialization and values append to list

问题:编写 function,对于给定的对象列表,返回类型为:[object] 的字典。 例如: func([1,2.0,3,'g']) returns: {'i':[1,3], 'f': [2.0], 'c': ['g'], 'o': []}

  • 整数的键i
  • 花车键f
  • 用于字符的键c
  • 其他人的关键o

我的代码:

def make_dict(lst):
    my_dict = {'i': [], 'f': [], 'c': [], 'o': []}
    [my_dict['i'].append(item) if isinstance(item, int) else my_dict['f'].append(item) if isinstance(
        item, float) else my_dict['c'].append(item) if isinstance(item, str) and len(item) == 1 else my_dict['o'].append(item) for item in lst]
    return my_dict

这个 function 返回了正确的字典,但我需要将其设为 One-Liner,另外,我不喜欢它的完成方式。 我知道在这里使用列表理解很糟糕。

我的过程是首先将其设为多行 function,我使用 for 循环和 if elif 语句进行了此操作,然后我尝试将这些行合并并最终将其降至 3。

这是我在将其组合成列表之前使用的 for 循环:

for item in lst:
    if isinstance(item, int):
        my_dict['i'].append(item)
    elif isinstance(item, float):
        my_dict['f'].append(item)
    elif isinstance(item, str) and len(item) == 1:
        my_dict['c'].append(item)
    else:
        my_dict['o'].append(item)
return my_dict

我的问题:我知道我需要以某种方式将某种字典理解与 filter() 的 map() 结合使用,但是在搜索互联网并找到注释之后。我只是不知道该怎么做。

也许你能帮助我? 谢谢!

您想要的是按数据类型的第一个字母对数据进行分组,以便

  • 获取其类型type(x).__name__[0]的第一个字母
  • 按此标准对数据进行分组

您需要向groupby提供按您将用于分组的相同标准排序的数据。 {k:list(v)部分是从groupby object 移动到dict

from itertools import groupby

def make_dict(lst):
    sorter = lambda x:type(x).__name__[0] if type(x).__name__ in ('int', 'float', 'str') else 'o'
    return {k:list(v) for k,v in groupby(sorted(lst, key=sorter), key=sorter)}

r = make_dict([1,2.0,3,'g']) # {'f': [2.0], 'i': [1, 3], 's': ['g']}
print(r)

使用filter ,但当您多次迭代列表时效率不高

def make_dict(lst):
    return {'i': list(filter(lambda x: isinstance(item, int), lst)), 
            'f': list(filter(lambda x: isinstance(item, float), lst)), 
            's': list(filter(lambda x: isinstance(item, str), lst)), 
            'o': type(x).__name__ not in ('int', 'float', 'str')}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM