感謝 各位大神 po了兩篇文後 讓我的程式到了最後一步
我是用graphviz這個套件來畫圖的
ip = [['192.168.1.1','168.95.98.254','168.95.83.70','220.128.2.226','220.128.1.101','168.95.25.13'], ['192.168.1.1','168.95.98.254','168.95.82.6','220.128.1.6','220.128.1.101','36.226.251.254']]
假如這是我的一個ip 列表
我是利用dict的方式來處理 節點都建好了
這是我的dict
{'192.168.1.1': '0', '168.95.98.254': '1', '168.95.83.70': '2', '220.128.2.226': '3', '220.128.1.101': '4', '168.95.25.13': '5', '168.95.82.6': '6', '220.128.1.6': '7', '36.226.251.254': '8'}
我要利用迴圈的方式去呈獻這個圖 該怎麼做呢
這個是我用手動的方式建的,我只要用迴圈去表示下面這行就可以了感謝大家
h = ['01', '12','23','34','45','01','16', '67','74','48']
h1 = set(h)
dot.edges(h1)
恭喜樓主...總算到最後一哩路了~加油!
下列這段代碼給您參考...
def find_index_in_ip_arr(ip_value):
return ip_arr.index(ip_value)
ip = [
['192.168.1.1','168.95.98.254','168.95.83.70','220.128.2.226','220.128.1.101','168.95.25.13'],
['192.168.1.1','168.95.98.254','168.95.82.6','220.128.1.6','220.128.1.101','36.226.251.254']
]
print(" ip 陣列內容個數: %d\n--------------------\n ip 陣列內容:\n%s" %(len(ip[0])*len(ip),ip))
print("====================")
ip_arr=[]
for ii in range(0,len(ip)):
for jj in range(0,len(ip[ii])):
if ip[ii][jj] not in ip_arr:
ip_arr.append(ip[ii][jj])
#創建ip_arr完成
print(" ip_arr 陣列長度: %d\n--------------------\n ip_arr 陣列內容:\n%s" %(len(ip_arr),ip_arr))
h=[]
for ii in range(0,len(ip)):
for jj in range(1,len(ip[ii])):
parrent_node=str(find_index_in_ip_arr(ip[ii][jj-1]))
current_node=str(find_index_in_ip_arr(ip[ii][jj]))
h.append(parrent_node+current_node)
print("====================")
print(" h 陣列長度: %d\n--------------------\n h 陣列內容:\n%s" %(len(h),h))
ps. 另外關於dict的生成...只要把 ip_arr跑廻圈取出 ip_arr[i]:i 的格式,轉成dict就行了,這部份您應該自己能處理。
學 comprehension 和 map、filter、reduce 可以省很多code。XD
像他這個我就完全不想用迴圈寫,很煩。
但是這樣對新手比較好理解
所以我有給關鍵字出來啊,他有興趣自己去查。XD
懂了以後慢慢就會看的懂,寫得出來了。
好的 我會去查的 我會慢慢學習 可是有人用過graphviz嗎?我發現用這個來畫,0到9都還ok,一到10就會跳錯欸,這個部份可以解決嗎
看了一下文件,你這種編碼方式只能用一個字元。
要用下面這種方式才能。
dot.node('0', '192.168.1.1')
dot.node('1', '168.95.98.254')
dot.node('2', '168.95.83.70')
dot.edge('0', '1', constraint='false')
https://graphviz.readthedocs.io/en/stable/manual.html
自己練習一下看文件、想想看怎麼寫吧。
弄到目前這樣我想你老闆也知道你大概的實力在哪,都我們給你code到時候又丟更難的難題給你,你就更慘。
沒有用過graphviz...
善用google搜尋大法,
跳錯的訊息你可以試試在 google 用英文關鍵字搜
例如:
graphviz "你遇到跳錯的訊息(英文的)"
如果跟程式有關的可以再加" stackoverflow " 下去搜看看
我大概修完了 不過我沒看你們的改:)
我先嘗試靠自己
我修完之後 他跳這個錯欸
dot: graph is too large for cairo-renderer bitmaps. Scaling by 0.661051 to fit
好像是說 圖片太大了
我上網查說-T svg這個指令可以使用 問題是要如何用在python 裡呢
關於"-T svg"我查了一下那個可能是command line的命令
https://www.openfoundry.org/tw/foss-programs/8820-graphviz-
在python中可以用os.system去執行cmd命令,例如:
from os import system
system("dot input.dot -T png -o output.png")
上面這二行做的事等同於你在命令列模式底下輸入
dot input.dot -T png -o output.png [Enter]
不過我沒有安裝 graphviz 沒試過 這部份樓主可以自己試試看
依你的dict有辦法透過迴圈弄的出h那個list才有鬼,根本沒辦法看出結構。
你要把每條路徑都先弄出來,然後做set,讓他不重複:
path1 = ['01', '12', '23', '34', '45']
path2 = ['01', '16', '67', '74', '48']
h1 = set(path1) | set(path2)
假設你有辦法把所有節點編成nodeDict好了,這你自己寫。
from functools import reduce
ip = [
['192.168.1.1','168.95.98.254','168.95.83.70','220.128.2.226','220.128.1.101','168.95.25.13'],
['192.168.1.1','168.95.98.254','168.95.82.6','220.128.1.6','220.128.1.101','36.226.251.254']
]
nodeDict = {
'192.168.1.1': '0',
'168.95.98.254': '1',
'168.95.83.70': '2',
'220.128.2.226': '3',
'220.128.1.101': '4',
'168.95.25.13': '5',
'168.95.82.6': '6',
'220.128.1.6': '7',
'36.226.251.254': '8'
}
def genPath(ipList):
_ = list(map(lambda x: nodeDict.get(x), ipList))
return list("".join(z) for z in zip(_[:-1], _[1:]))
paths = [genPath(path) for path in ip]
h1 = reduce(lambda x, y: set(x)|set(y), paths)