已经提出使用的解决方案
- 解析器:太长了
- 一个正则表达式:我喜欢它,但需要知道正则表达式
- ast 模块:有趣但也需要了解它
.
我以初学者可以理解的最简单的方式处理问题。
此外,我的解决方案表明 Python 的内置功能足以完成这项工作。
.
首先,我将您的代码修正后,WhiteDawn,以便您能够看到您必须理解的非常基本的点,可以使用 Python 的特性对其进行简化。
比如seq是一个序列,seq[len(seq)-1]是它的最后一个元素,但是seq[-1] 也是最后一个元素。
顺便说一句,您的代码中有一个错误:我认为是
line[1][end] = line[1][end][:len(line[1][end])-1]
# not:
line[1][end] = line[1][end][:len(line[1][end])-2]
否则执行时出错
还要注意伟大的函数enumerate()
而且你必须研究列表的切片:if li = [45, 12, 78, 96] then li[2:3] = [2, 5, 8] 将 li 转换为 li = [45, 12, 2, 5, 8, 96]
y = "4:(1,2;4),(2,6;3),(3,7;15),(4,8;1),(5,6;1),(6,7;1),(5,9;9),(6,10;2),(7,11;1),(8,12;23),(9,10;5),(9,13;7),(10,14;6),(11,15;3),(12,16;3),(13,14;4),(15,16;7)"
def partitionData(line):
finalDic = dict()
#partition the data around the formating
print 'line==',line
line = line.split(":")
print '\ninstruction : line = line.split(":")'
print 'line==',line
print 'len of line==',len(line),' (2 strings)'
print '---------------------'
line[1] = line[1].split("),(")
print '\ninstruction : line[1] = line[1].split("),(")'
print 'line[1]==',line[1]
#clean up data some more
line[1][0] = line[1][0][1:]
print 'instruction : line[1][0] = line[1][0][1:]'
line[1][-1] = line[1][-1][0:-1]
print 'instruction : line[1][-1] = line[1][-1][0:-1]'
print 'line[1]==',line[1]
print '---------------------'
#simplify data and organize into a list
for i,x in enumerate(line[1]):
line[1][i] = x.split(",")
line[1][i][1:] = line[1][i][1].split(";")
print 'loop to clean the data in line[1]'
print 'line[1]==',line[1]
print '---------------------'
#convert everything to integer to simplify algorithm
print 'convert everything to integer to simplify algorithm'
for i,x in enumerate(line[1]):
line[1][i] = map(int,x)
line[0] = int(line[0])
print 'line==',line
print '---------------------'
newData = dict()
for a,b,c in line[1]:
newData[(a,b)] = c
line[1] = newData
print 'line==',line
print '---------------------'
for i in line[1]:
print 'i==',i,' (min(i),max(i))==',(min(i),max(i))
if not ((min(i),max(i)) in finalDic):
finalDic[(min(i),max(i))] = line[1][i]
else:
print "There is a edge referenced twice!"
exit()
line[1] = finalDic
print '\nline==',line
return line
print partitionData(y)
.
其次,我的解决方案:
y = "4:(1,2;4),(2,6;3),(3,7;15),(4,8;1),(5,6;1),(6,7;1),(5,9;9),(6,10;2),(7,11;1),(8,12;23),(9,10;5),(9,13;7),(10,14;6),(11,15;3),(12,16;3),(13,14;4),(15,16;7)"
# line[1]== {(1, 2): 4, (5, 9): 9, (2, 6): 3, (6, 7): 1, (4, 8): 1, (5, 6): 1, (6, 10): 2, (9, 10): 5, (13, 14): 4, (11, 15): 3, (10, 14): 6, (9, 13): 7, (12, 16): 3, (7, 11): 1, (3, 7): 15, (8, 12): 23, (15, 16): 7}
def partitionData(line):
finalDic = dict()
#partition the data around the formating
print '\nline==',line
line = line.split(":")
print '\ninstruction:\n line = line.split(":")'
print 'result:\n line==',line
print '\n----------------------------------------------------'
print '\nline[1]==',line[1]
line[1] = line[1][1:-1].replace(";",",")
print '\ninstruction:\n line[1] = line[1][1:-1].replace(";",",")'
print 'result:\n line[1]==',line[1]
line[1] = [ x.split(",") for x in line[1].split("),(") ]
print '\ninstruction:\n line[1] = [ x.split(",") for x in line[1].split("),(") ]'
print 'result:\n line[1]==',line[1]
line = [int(line[0]),dict( ((int(a),int(b)),int(c)) for (a,b,c) in line[1] ) ]
print '\ninstruction:\n line = [int(line[0],dict( ((int(a),int(b)),int(c)) for (a,b,c) in line[1] ) ]'
print 'result:\n line[1]==',line[1]
for i in line[1]:
if not ((min(i),max(i)) in finalDic):
finalDic[(min(i),max(i))] = line[1][i]
else:
print "There is a edge referenced twice!"
exit()
line[1] = finalDic
print '\nline[1]==',line[1]
return line
print partitionData(y)
我没有触及 FinalDict 的结尾,因为我不明白这个 sn-p 是做什么的。
如果 i 是一对整数,则 (min(i),max(i)) 就是这对夫妇本身