如何在python中基于dct.keys创建组
我想根据字典键创建组。若键位于多个字典中,我想创建一个组,以便以后使用。我几乎成功了,但是我没有得到想要的输出。如下所示,有两个可能的组。即dct1和dct3相同的键18,DCT2和DCT4相同的键8。下面是我到目前为止创建的内容如何在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 = {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))]