输入:
>>> foo = {("A", "B"), ("A", "G"), ("A", "H"),
... ("B", "C"), ("B", "H"),
... ("C", "D"),
... ("D", "E"), ("D", "G"), ("D", "H"),
... ("E", "F"), ("E", "G"), ("E", "H"),
... ("F", "I"), ("F", "J"), ("F", "K"),
... ("G", "H")}
我正试图像这样对我的集合进行分组,到目前为止我一直没有成功,我设法将它们分组为这样。
实际输出:
>>> {k:set(x[1] for x in v) for k,v in itertools.groupby(sorted(foo), key=lambda x: x[0])}
{'B': {'C', 'H'}, 'E': {'H', 'G', 'F'}, 'D': {'E', 'G', 'H'}, 'A': {'B', 'G', 'H'}, 'C': {'D'}, 'G': {'H'}, 'F': {'I', 'K', 'J'}}
然而,这是我的期望输出:
foo1 = {"A": {"B", "G", "H"},
"B": {"A", "H", "C"},
"C": {"B", "D"},
"D": {"C", "E", "G", "H"},
"E": {"D", "F", "G", "H"},
"F": {"E", "I", "J", "K"},
"G": {"A", "D", "E", "H"},
"H": {"A", "B", "D", "E", "G"},
"I": {"F"},
"J": {"F"},
"K": {"F"}
}
我在考虑排列或组合?但我仍然不知道该怎么做。 提前致谢。 编辑:添加了字符串相关的图片。
答案 0 :(得分:4)
这样的东西?
foo = {("A", "B"), ("A", "G"), ("A", "H"), ("B", "C"), ("B", "H"), ("C", "D"), ("D", "E"), ("D", "G"), ("D", "H"), ("E", "F"), ("E", "G"), ("E", "H"), ("F", "I"), ("F", "J"), ("F", "K"), ("G", "H")}
from collections import defaultdict
result = defaultdict(set)
for key1, key2 in foo:
result[key1].add(key2)
result[key2].add(key1)
from pprint import pprint
pprint(result)
与目前为止的其他答案相反,它产生了所需的输出,尽管是无序的:
{'A': {'B', 'G', 'H'},
'B': {'A', 'C', 'H'},
'C': {'B', 'D'},
'D': {'G', 'C', 'H', 'E'},
'E': {'G', 'D', 'H', 'F'},
'F': {'I', 'J', 'K', 'E'},
'G': {'A', 'D', 'H', 'E'},
'H': {'B', 'A', 'G', 'D', 'E'},
'I': {'F'},
'J': {'F'},
'K': {'F'}}
答案 1 :(得分:2)
(拜托,请不要这样做)
python3
Python 3.5.2+ (default, Sep 22 2016, 12:18:14)
[GCC 6.2.0 20160927] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import itertools
>>> import pprint
>>>
>>> foo = {("A", "B"), ("A", "G"), ("A", "H"),
... ("B", "C"), ("B", "H"),
... ("C", "D"),
... ("D", "E"), ("D", "G"), ("D", "H"),
... ("E", "F"), ("E", "G"), ("E", "H"),
... ("F", "I"), ("F", "J"), ("F", "K"),
... ("G", "H")}
>>>
>>> foo1 = {k: {x[1] for x in v} for k, v in itertools.groupby(sorted(foo | {(a, b) for b, a in foo}), key=lambda x: x[0])}
>>> pprint.pprint(foo1)
{'A': {'H', 'B', 'G'},
'B': {'C', 'H', 'A'},
'C': {'D', 'B'},
'D': {'C', 'E', 'H', 'G'},
'E': {'D', 'H', 'F', 'G'},
'F': {'K', 'J', 'E', 'I'},
'G': {'D', 'E', 'H', 'A'},
'H': {'D', 'E', 'B', 'G', 'A'},
'I': {'F'},
'J': {'F'},
'K': {'F'}}
答案 2 :(得分:-1)
您可以使用常规字典,但defaultdict
可以使这更容易。
from collections import defaultdict
d=defaultdict(set)
for key, value in foo:
f[key].add(value)
使用常规字典:
d = {}
for key, value in foo:
if key not in d:
d[key]=set()
d[key].add(value)