1

例子:

complete_dict = dict()
common_set = set()
for count, group_name in enumerate(groups_dict):
    complete_dict[group_name] = dict()  # grabs a json file = group_name.json

    if count > 0:
        common_set.intersection_update(complete_dict[group_name])
    else:
        # this accounts for the fact common_set is EMPTY to begin with
        common_set.update(complete_dict[group_name])

WHERE:dict2包含 k:v 个成员(组):int(x)

是否有更合适的方法来处理交叉口的初始状态?

即我们不能与第一个相交complete_dict[group_name]common_set因为它是空的,因此结果也是空的。

4

3 回答 3

2

避免这种特殊情况的一种方法是使用项目的内容初始化集合。由于与自身相交的值就是值本身,因此您不会以这种方式丢失任何东西。

这是一个尝试展示这如何工作的尝试。我不确定我是否理解您的不同dict(...)调用应该代表什么,因此这可能无法完美地转化为您的代码,但它应该让您走上正确的道路。

it = iter(dict(...)) # this is the dict(...) from the for statement
first_key = next(it)
results[first_key] = dict(...) # this is the dict(...) from inside the loop

common = set(results[first_key]) # initialize the set with the first item

for key in it:
    results[key] = dict(...) # the inner dict(...) again
    common.intersection_update(result[key])

正如 jamylak 所评论的那样,您对各种字典的方法进行的调用总是不必要的(如果您不进行任何索引或使用特定于映射的方法keys,字典的行为就像一个键)。set我还选择了更符合 Python 风格的变量(lowercase用于常规变量,CAPITALS保留用于常量)。

于 2013-04-25T11:46:44.607 回答
1

遵循Blcknght的回答,但复杂性和重复性较低:

common = None
uncommon = {}

for key in outer_dict:
    inner = uncommon[key] = inner_dict(...)
    if common is None:
        common = set(inner)
    else:
        common.intersection_update(inner)

像 Blcknght 一样,很难知道这是否抓住了原始的意图,因为变量名称既不是描述性的,也不是不同的。

于 2013-04-25T12:43:46.937 回答
0

从逻辑上讲,当我们要分配多个集合之间的交集的输出时,我们将最小的集合(具有最小长度的集合)分配给输出集合并与其他集合进行比较,对吗?

uncommon_result = dict(...)  # a method that returns a dict()
common_set=sorted([(len(x),x) for x in uncommon_result.values()])[0][1]
for a_set in uncommon_result.values():
    common_set.intersection_update(a_set)

我知道第二行可能是最糟糕的事情之一,COMMON_SET因为它做了很多不必要的工作,但从数学上讲,我们几乎一直想知道我们的哪个集合是最小的,在这种情况下,这些工作不是徒劳无功。

编辑:如果 uncommon_result 是 dicts 的 dict,您可能需要添加另一个 for 循环来检查它的键,并且在上面的内部 for 中进行一些小的更改,您会再次好起来的。

于 2013-04-25T12:04:54.150 回答