将字符串从集合分组到字典python

时间:2016-11-16 17:39:13

标签: python python-3.x dictionary set permutation

输入:

>>> 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"}
         }

我在考虑排列或组合?但我仍然不知道该怎么做。 提前致谢。 编辑:添加了字符串相关的图片。

3 个答案:

答案 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)

OP要求理解这样做,所以这是一个无偿的一个班轮:

(拜托,请不要这样做)

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)