如何在集

时间:2016-02-18 02:38:13

标签: python dictionary

我有一个包含小字典的集合,保存为字符串,如下所示:

set(["{u'151H0': 28, u'151H1': 1}", "{u'151H0': 38, u'151H1': 1}", "{u'151H0': 36, u'151H1': 1}", "{u'151H0': 37, u'151H1': 1}"]) 

我可以使用eval()轻松地将集合中的每个项目从字符串转换为小字典,但我试图找出一个好的算法来记录集合中的哪些键具有多个值。

例如,如上所示,有两个键'151H0'和'151H1'。键'151H1'在每种情况下仅具有值1。键'151H0'的值为28,38,36和37.我想要的是找到一种优雅的方式来读取该组并返回键'151H0',因为它有多个关联值,并忽略该键'151H1'因为它总是具有相同的值。

作为奖励,我想将值的平均值作为返回键的整数。在这种情况下,它将是35.所以我的输出可能是一个元组,如:'151H0',35

我正在寻求帮助,因为到目前为止我提出的解决方案涉及的代码行数多于我认为应该为此所需的代码。

1 个答案:

答案 0 :(得分:3)

你需要转换为真实的dict,不,eval不是要走的路(这是一个巨大的标志,上面写着“这段代码不安全!”)。 Use ast.literal_eval为此,它的工作方式相同,只是它只评估合法的Python文字,因此它不能用于执行任意代码。无论如何,执行此操作的简单方法是use collections.defaultdict累积每个键的值,以便您知道哪些键具有多个唯一值:

import ast
from collections import defaultdict

partialdataset = ... your set goes here ...

# Accumulate values for each key
valuetracker = defaultdict(set)
for partialdict in map(ast.literal_eval, partialdataset):
    for k, v in partialdict.viewitems():  # Just .items() on Py3
        valuetracker[k].add(v)

# Keep only keys with more than one value (non-unique, because we used set)
# computing the average
nonuniquekeys = {k: round(sum(v) / float(len(v))) for k, v in valuetracker.viewitems() if len(v) > 1}