Python字典初始化和附加到列表的值

Python字典初始化和附加到列表的值,python,dictionary-comprehension,Python,Dictionary Comprehension,问题:编写一个函数,用于为给定的对象列表返回类型为:[object]的字典。 例如:func([1,2.0,3,'g'])返回:{'i':[1,3],'f':[2.0],'c':['g'],'o':[]} ints的键i 键f用于浮动 钥匙c用于字符 键o用于其他 我的代码: def make_dict(lst): my_dict = {'i': [], 'f': [], 'c': [], 'o': []} [my_dict['i'].append(item) if isin

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

  • ints的键
    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
这个函数返回正确的字典,但是我需要使它成为一行,另外,我不喜欢它的方式。我知道列表理解的使用在这里很糟糕

我的想法是首先将它变成一个多行函数,我用它来处理循环和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)。\uuu name\uuuu[0]
  • 按此条件对数据进行分组
您需要将数据提供给分组依据groupby,并按照分组时使用的相同标准进行排序。
{k:list(v)
部分将从
groupby
对象移动到
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)

使用
过滤器
,但在多次迭代列表时效率不高

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')}

你在列表理解中编码了什么?因为你没有保留它,所以使用loo^pI did列表理解,因为我的目标是使它成为一行。我做的第一件事是用for循环和if elif语句来解决它,然后我尝试将所有这些合并到一行列表理解中。共享if/else代码,首先更容易理解。另外,你没有解释目的,我们必须自己去弄清楚一个解释会更好为什么你想要一行?使用多个语句。这使代码更易于编写和阅读。你需要直接创建列表;你不能一次追加一项。这就是为什么这很难做到的原因。下面有一个答案at似乎有效,但我仍然强烈建议使用第二个代码段中的代码,即使它不是一行程序。如果将它放在函数中,它实际上是一行程序,因为无论在哪里调用它都会像
my_dict=make_dict(lst)
。大多数一行程序都是通过调用其他内置函数来实现的,但这与调用您的一个函数没有区别谢谢。我认为这是一个进步,但我没有首先解释好格式,标准应该是:'I'表示整数,'f'表示浮点,'c'表示字符,以及'o'表示其他。我们有什么办法吗这是一个映射函数实例吗?在我的脑海中,这是一个“正确”的方法,我尝试将我的“坏”列表转换成一个映射函数。(我们在课堂上学习了映射、过滤和缩减函数,而不是groupby。)您认为这是可能的,或者groupby是最好的方法?再次感谢!@Birkagal您可以将lambda更改为
lambda x:type(x)。\uuuuu name\uuuu[0]如果type(x)。\uuuu name\uuuuu'in('int','float','str'))else'o'
@Birkagal映射操作是将数据转换为另一个数据,这不是我们在这里要做的,使用循环loke另一个答案,或groupby,('ve add the default other)@azro是的,映射问题是我遇到的(事实上它正在制作新的,而不是更改原始字典)那么有没有一种方法可以使用过滤器呢?因为老实说,问题是:“使用map/reduce/filter和lambda表达式来创建一个行函数,它可以….”这就是为什么我试图找到一种方法来使用课堂上学到的东西。@Birkagal我已经提出了一个使用过滤器的解决方案,这是我的最后一句话