Python 将字符串转换为包含集合的字典

Python 将字符串转换为包含集合的字典,python,Python,我有一个字符串,格式如下: inp="({A,B,C},{(A,B),(B,C),(C,A)})" {A,B,C}表示图形中的节点 {(A,B)、(B,C)、(C,A)}表示连接的节点 我想将此字符串转换为如下所示的字典: graph = {'A': set(['B','C']), 'B': set(['C','A']), 'C': set(['A','B'])} set包含key节点所连接的节点 A连接到B。 B连接到C,C连接到A` 如何实现这一点?快速而

我有一个字符串,格式如下:

inp="({A,B,C},{(A,B),(B,C),(C,A)})"
{A,B,C}
表示图形中的节点

{(A,B)、(B,C)、(C,A)}
表示连接的节点

我想将此字符串转换为如下所示的字典:

graph = {'A': set(['B','C']),
        'B': set(['C','A']),
        'C': set(['A','B'])}
set
包含
key
节点所连接的节点

A
连接到
B
B
连接到
C
C连接到
A`


如何实现这一点?

快速而肮脏的解决方案

inp = "({A,B,C},{(A,C),(B,C),(C,A)})"
nodes,edges = inp[2:-2].split('},{')
nodes = nodes.split(',')
edges = [x.split(',') for x in edges[1:-1].split('),(')]
graph = dict([(node,set()) for node in nodes])
for edge in edges:
    graph[edge[0]].add(edge[1])
    graph[edge[1]].add(edge[0])
print graph

Regex、lambda函数和列表对rescue的理解:

import re
inp="({A,B,C},{(A,B),(B,C),(C,A)})"

m = re.search("{(.*?)},{\((.*?)\)}",inp)

nodes = m.group(1).split(',')
edges = map(lambda x:x.split(','), m.group(2).split('),('))
graph = {}

for i in nodes:
 graph[i]=set([edge[edge.index(i)-1] for edge in edges if i in edge])

print graph
给出:

{'A': set(['C', 'B']), 'C': set(['A', 'B']), 'B': set(['A', 'C'])}
基于输入格式的模式匹配有点老套,但如果删除空格,就可以了。如果边具有多个字符的名称,它也可以非常好地工作

因为所有的酷孩子似乎都是关于单一列表的理解,这里有3行(如果排除输入,则为2行):


有点离谱:假设您的输入语法是python

import ast
d = {}
_s1, s2 = (node for node in ast.walk(ast.parse(inp)) if isinstance(node, ast.Set))

for tup in s2.elts:
    n1,n2 = tup.elts
    d.setdefault(n1.id,set()).add(n2.id)
    d.setdefault(n2.id,set()).add(n1.id)
给予


你是说inp
inp
中的节点是
{(A,B)、(B,C)、(C,A)}
?这些都是连接。我的意思是,你把第一个节点搞乱了。它是“A”:set(['B']还是应该是“A”:set(['C'])?对不起,这是个错误。我已经编辑了它。
import ast
d = {}
_s1, s2 = (node for node in ast.walk(ast.parse(inp)) if isinstance(node, ast.Set))

for tup in s2.elts:
    n1,n2 = tup.elts
    d.setdefault(n1.id,set()).add(n2.id)
    d.setdefault(n2.id,set()).add(n1.id)
d
Out[69]: {'A': set(['B', 'C']), 'B': set(['A', 'C']), 'C': set(['A', 'B'])}