Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中基于dct.keys创建组_Python_Python 2.7_List_Function_Dictionary - Fatal编程技术网

如何在python中基于dct.keys创建组

如何在python中基于dct.keys创建组,python,python-2.7,list,function,dictionary,Python,Python 2.7,List,Function,Dictionary,我想根据字典键创建组。若键位于多个字典中,我想创建一个组,以便以后使用。我几乎成功了,但是我没有得到想要的输出。如下所示,有两个可能的组。即dct1和dct3相同的键18,DCT2和DCT4相同的键8。下面是我到目前为止创建的内容 dct1 = {20: [(87, 6), (87, 7)], 21: [(68, 8)], 18: [(30, 7)], 11: [(27, 7), (28, 7)]} dct2 = {8: [(41, 5), (4

我想根据字典键创建组。若键位于多个字典中,我想创建一个组,以便以后使用。我几乎成功了,但是我没有得到想要的输出。如下所示,有两个可能的组。即dct1和dct3相同的键18,DCT2和DCT4相同的键8。下面是我到目前为止创建的内容

dct1 = {20: [(87, 6), (87, 7)],
        21: [(68, 8)],
        18: [(30, 7)],
        11: [(27, 7), (28, 7)]}

dct2 = {8: [(41, 5), (41, 6), (41, 4)],
        14: [(4, 7), (5, 7), (6, 7)],
        16: [(58, 7), (56, 7), (57, 7)]}

dct3 = {4: [(41, 5), (41, 6), (41, 4)],
        15: [(77, 7), (78, 7)],
        18: [(29, 9), (29, 8)],
        3: [(27, 7), (28, 7)]}

dct4 = {8: [(41, 5), (41, 6), (41, 4)],
        30: [(6, 9), (5, 7), (7, 9)],
        35: [(58, 7), (56, 7), (57, 7)]}

rwawl = [dct1, dct2, dct3, dct4]


def group_rooms(rectangles_with_adjacent_walls_list):
    groups = []
    for rectangle in rectangles_with_adjacent_walls_list:
        adjacent_wall_list = rectangle.keys()
        if not groups:
            groups.append([adjacent_wall_list])
        print adjacent_wall_list
        new_group_threshold = len(adjacent_wall_list)
        new_group = 0

        for adjacent_wall in adjacent_wall_list:
            for added_room in groups:
                if adjacent_wall in added_room:
                    added_room.append(adjacent_wall_list)
                    break
                else:
                    new_group += 1

            if new_group == new_group_threshold:
                groups.append([adjacent_wall_list])

    print groups
    return groups


created_groups = group_rooms(rwawl)

# MY OUTPUT:
# [[[18, 11, 20, 21]], [[18, 11, 20, 21]], [[18, 3, 4, 15]], [[8, 35, 30]]]

# DESIRED OUTPUT:
# [[[18, 11, 20, 21], [18, 3, 4, 15]], [[8, 16, 14], [8, 35, 30]]]
输出:

[[[18, 11, 20, 21], [18, 3, 4, 15]], [[8, 16, 14], [8, 35, 30]]]

下面将生成所需的输出,至少对于您给出的示例是这样。这将为多个DICT中出现的每个键创建一个组:

def group_rooms(dicts):
    key_sets = [set(d.keys()) for d in dicts]
    # union of all keys
    total_keys = reduce(lambda x, y: x | y, key_sets, set())
    key_groups = [map(list, filter(lambda s: k in s,  key_sets)) for k in total_keys]
    # return groups with removed singletons
    return filter(lambda s: len(s) > 1, key_groups)

如果有一个键,在所有的单词中都说10。您想要的输出是什么样子的?为您检查它。它在列表中创建一个列表,然后再在一个列表中创建一个。如果一个键出现在3个dict中怎么办?您将创建三组,每组两个。列表中包含键。未定义值。也有可能说这段代码中发生了什么,我可以复制粘贴它,我不明白这里发生了什么。请看我的答案。这篇文章的灵感与此类似,可能更具可读性。哦,用键列出。值应替换为键组。还有一个问题。如果字典中有一个键,代码不会创建组。是的,我在事后将dict更改为一个列表:似乎代码不会为没有对的键创建组。示例:dct5={99:[40,2]}代码似乎没有为没有配对的密钥创建组示例dct5={99:[40,2]}我修改了代码以包含未配对的词典。
def group_rooms(dicts):
    key_sets = [set(d.keys()) for d in dicts]
    # union of all keys
    total_keys = reduce(lambda x, y: x | y, key_sets, set())
    key_groups = [map(list, filter(lambda s: k in s,  key_sets)) for k in total_keys]
    # return groups with removed singletons
    return filter(lambda s: len(s) > 1, key_groups)
from collections import defaultdict
import itertools

dct1 = {20: [(87, 6), (87, 7)],
        21: [(68, 8)],
        18: [(30, 7)],
        11: [(27, 7), (28, 7)]}

dct2 = {8: [(41, 5), (41, 6), (41, 4)],
        14: [(4, 7), (5, 7), (6, 7)],
        16: [(58, 7), (56, 7), (57, 7)]}

dct3 = {4: [(41, 5), (41, 6), (41, 4)],
        15: [(77, 7), (78, 7)],
        18: [(29, 9), (29, 8)],
        20: [(27, 7), (28, 7)]}

dct4 = {8: [(41, 5), (41, 6), (41, 4)],
        30: [(6, 9), (5, 7), (7, 9)],
        35: [(58, 7), (56, 7), (57, 7)]}

dct5 = {99: [(1, 1)]}

l = [dct1, dct2, dct3, dct4, dct5]

key_map = defaultdict(list)
all_keys = set()
for d in l:
    all_keys.add(tuple(d.keys()))
    for k in d.keys():
        key_map[k].append(tuple(d.keys()))
dup_keys = [tuple(v) for k, v in key_map.items() if len(v) > 1]
unique_dup_keys = set(itertools.chain(*dup_keys))
diff = all_keys - unique_dup_keys

dup_keys = set(dup_keys)

key_groups = list((dup_keys | diff))
print(key_groups)

# [((8, 16, 14), (8, 35, 30)), (99,), ((18, 11, 20, 21), (20, 18, 4, 15))]