gpt4 book ai didi

python - 将列表元素映射到字典中的键以获取 python 中的十进制值

转载 作者:行者123 更新时间:2023-11-28 21:40:06 65 4
gpt4 key购买 nike

我有一个单词列表如下。

mylist = ['cat', 'yellow', 'car', 'red', 'green', 'jeep', 'rat','lorry']

我还有一个列表列表,用于数据集中的每篇文章,其中包含下面示例中给出的“mylist”的值(即,如果“mylist”一词出现在文章中,它会产生 0-1 之间的值) .

[[0,0.7,0,0,0,0.3,0,0.6], [0.2,0,0,0,0,0,0.8,0]]

换句话说,

[0,0.7,0,0,0,0.3,0,0.6] says that this only has values 'yellow', 'jeep', 'lorry'

现在我有一个类别字典如下。

mydictionary = {'colour': ['red', 'yellow', 'green'], 'animal': ['rat','cat'], 
'vehicle': ['car', 'jeep']}

现在,通过使用“mydictionary”键值,我想按如下方式转换列表列表(也就是说,如果“mylist”的一个或多个值为 1,我将键标记为平均值 分数的值)。

[[0.7, 0, 0.45], [0, 0.5, 0]]

换句话说,

[0.7, 0, 0.45] says that;
0.7 - average value for elements in 'colours' = 0.7/1 = 0.7
0 - no elements in 'animals'
0.45 - average value for elements in 'vehicles' = (0.3+0.6)/2 = 0.45

所以我的输出应该是上面提到的列表列表 -> [[0.7, 0, 0.45], [0, 0.5, 0]]

我很想知道这是否可以使用 pandas 数据帧来实现。

最佳答案

你真的应该重新考虑你的数据结构。您将面临的一个问题是 dict 本质上是无序的。因此,首先,通过将值放入有序容器(list 可以正常工作)来执行顺序:

>>> vals = [mydictionary['colour'], mydictionary['animal'], mydictionary['vehicle']]

现在是论文:

>>> essays = [[0,0.7,0,0,0,0.3,0,0.6], [0.2,0,0,0,0,0,0.8,0]]

然后,一个简单的循环,构建从 mylist 到每篇文章权重的映射,并为 mean 函数使用 statistics 包:

>>> import statistics as stats
>>> result = []
>>> for essay in essays:
... map = dict(zip(mylist, essay))
... result.append([stats.mean(map[e] for e in v) for v in vals])
...
>>> result
[[0.2333333333333333, 0, 0.15], [0, 0.5, 0]]

老实说,不确定 pandas 是否是最好的工具,但我想你可以像这样使用 DataFrame:

>>> df = pd.DataFrame({'essay{}'.format(i):essay for i, essay in enumerate(essays)}, index=mylist)
>>> df
essay0 essay1
cat 0.0 0.2
yellow 0.7 0.0
car 0.0 0.0
red 0.0 0.0
green 0.0 0.0
jeep 0.3 0.0
rat 0.0 0.8
lorry 0.6 0.0

然后,制作石斑鱼映射:

>>> grouper  = {v: k for k, vv in mydictionary.items() for v in vv}

然后使用pd.DataFrame.groupby:

>>> df.groupby(grouper).mean()
essay0 essay1
animal 0.000000 0.5
colour 0.233333 0.0
vehicle 0.150000 0.0

编辑

评论之后,修复非常简单,您只需将权重具体化到一个列表中,像这样过滤 0:[map[e] for e in v if map[e]] ,然后取该列表的 mean。但是,您必须注意该列表不为空。只需定义一个检查或返回默认值 0 的辅助函数:

>>> def mean_default(seq):
... if seq:
... return stats.mean(seq)
... else:
... return 0
...

然后简单地:

>>> result = []
>>> for essay in essays:
... map = dict(zip(mylist, essay))
... result.append([mean_default([map[e] for e in v if map[e]]) for in vals])

对于 pandas,如@IanS 所示,只需将 0 替换为 np.nan

关于python - 将列表元素映射到字典中的键以获取 python 中的十进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45994760/

65 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com