将字符串从集合分组到字典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)
:-)