Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Python_Python 3.x_Dictionary_Set_Permutation - Fatal编程技术网

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

将字符串从集合分组到字典python,python,python-3.x,dictionary,set,permutation,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")

输入:

>>> 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'}}
我正试着像这样对我的集合进行分组,到目前为止我一直没有成功,我只能这样对它们进行分组

实际输出:

>>> 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"}
         }
我在想排列还是组合?但我还是不知道怎么做。 提前谢谢。
编辑:添加了字符串之间关系的图片。

您可以使用常规词典,但使用
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)
像这样的

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

OP要求在理解的情况下完成这项工作,所以这里有一条免费的单行线:

(请,请不要这样做)


您希望如何确定字符串的分组方式?编辑:等等,我想我看到了,但请把这个问题放在问题中。鉴于Python集合和dict本质上是无序的,您希望输出有一个特定的顺序吗?您的排序dict理解排序正确,但它没有以您想要的方式打印给您?编辑:nvm,我看到你的图片中有一些错误。如果你正在处理图形,请查看NetworkX。请不要损坏你的图片post@HappyUnicorn你可以理解一下:
{(k,v)代表k in foo1代表v in foo1[k]}
@PatrickHaugh:那是什么?无论它要替换什么,如果将其作为
{(k,v)表示k,vs-in-foo1.items()表示v-in-vs}
;为每个键保存一个冗余的查找,但我不确定它的用途。@ShadowRanger OP询问了一种从字典中获取原始列表的方法,但随后删除了他们的注释。@PatrickHaugh:啊,这很有意义。但是,该集合理解实际上不会恢复原始的
集合
;原始的
集合
经过重复数据消除,使得每对的第一个元素始终小于每对的第二个元素(因此您可以看到
A,B
,但看不到
B,A
)。如果要保留该不变量,您需要:
{(k,v)表示k,vs in foo1。items()表示v in vs If k
,以过滤出重复的关联。@ShadowRanger我意识到了这一点,但没有注意到原始数据是如何排序的。这条记录的
很好,虽然它浪费了创建空集并丢弃它们的时间,但您可以通过删除成员资格测试,将常规的dict案例从三个
dict
查找简化为一个,只需执行:
For key,value in foo:
foo1.setdefault(key,set()).add(value)
foo1.setdefault(value,set()).add(key)
。或者,为了避免
set
调用的开销,在Py 3.5及更高版本中,使用独眼猴子操作符(由我创造的名称)通过语法而不是构造函数调用生成空集:
foo1.setdefault(key,{*()})。add(value)
:-)