我正在处理一个列表,其中包含我感兴趣的三个不同类别:整数、 float 和字符串。我想将该列表转换为字典并将这三个类别中的每一个都变成一个键,然后将该列表的每个元素分配给适当的键值(例如,如果列表中的元素是一个字符串,那么它将被分配到“字符串”键的值)。例如:
sample_list = [1.23, 34.34, 'abc', 'xyz', 22, 104]
字典的结构应该是这样的:
new_dict = {"integers" : [list of all ints],
"floats" : [list of all floats],
"strings" : [list of all strings],
}
从上面的示例列表中,输出将如下所示:
list_to_dict = {'float': [1.23, 34.34],
'integer', [22, 104],
'string', ['abc', 'xyz']
}
我正在使用 dict() 和 zip() 将字典转换为列表,但我不确定如何构建条件以将原始列表的每个元素放入正确的键值对中。这是我到目前为止所拥有的:
keys = ['integers', 'floats', 'strings']
values = [1.23, 34.34, 'abc', 'xyz', 22, 104]
mixed_dictionary = dict(zip(keys,values))
这是正确的方法还是我应该做些不同的事情?如果这是正确的方法,我如何添加条件以将所有列表元素放入适当的键值中?我尝试使用 for 循环和 .append(),但都没有用。
请您参考如下方法:
您想根据某些谓词分组您的数据。基本步骤是:
- 确定该项目属于哪个组
- 将项目放入该组对应的“桶”中。
有很多方法可以实现这一点。有些比其他的更直接。
选项 1
这是 itertools.groupby 的一个很好的用例.这里的谓词是元素的类型。
但是请注意,如果您的数据一开始没有按类型排序,这将不起作用。这可能会导致问题,因此请先对数据进行预排序:
sample_list.sort(key=lambda x: id(type(x)))
现在,调用 groupby,并将每个组解包为 dict comprehension 中的列表:
from itertools import groupby
{i.__name__ : list(g) for i, g in groupby(sample_list, key=type)}
{
"float": [
1.23,
34.34
],
"str": [
"abc",
"xyz"
],
"int": [
22,
104
]
}
选项 2
这是使用 groupby 的替代方法来自 pandas API。这不需要预分类步骤。
import pandas as pd
s = pd.Series(sample_list)
s.groupby(s.map(lambda x: type(x).__name__)).apply(list).to_dict()
{
"float": [
1.23,
34.34
],
"str": [
"abc",
"xyz"
],
"int": [
22,
104
]
}
选项 3
这是使用带有 setdefault 的字典的第三个选项(类似于带有 defaultdict 的其他答案):
gps = {}
for s in sample_list:
gps.setdefault(type(s).__name__, []).append(s)
gps
{
"float": [
1.23,
34.34
],
"str": [
"abc",
"xyz"
],
"int": [
22,
104
]
}
但是,如果我们谈论效率,则与 dict + setdefault 相比,另一个答案中的 defaultdict 方法稍微更有效。
