Python 字典初始化和值附加到列表
Python dictionary initialization and values append to list
问题:为给定的对象列表编写函数,returns 类型的字典:[object]。
例如:func([1,2.0,3,'g']) returns: {'i':[1,3], 'f': [2.0], 'c': ['g'], 'o': []}
- key
i
for int
- key
f
用于浮动
- key
c
for chars
- 关键
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
此函数返回正确的字典,但我需要将其设为单行,另外,我不喜欢它的完成方式。我知道在这里使用列表理解是不好的。
虽然我的过程是首先将它变成一个多行函数,我确实使用了 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
对象移动到 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')}
问题:为给定的对象列表编写函数,returns 类型的字典:[object]。
例如:func([1,2.0,3,'g']) returns: {'i':[1,3], 'f': [2.0], 'c': ['g'], 'o': []}
- key
i
for int - key
f
用于浮动 - key
c
for chars - 关键
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
此函数返回正确的字典,但我需要将其设为单行,另外,我不喜欢它的完成方式。我知道在这里使用列表理解是不好的。
虽然我的过程是首先将它变成一个多行函数,我确实使用了 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
对象移动到 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')}