iT邦幫忙

0

求各位大神 差最後一步了

感謝 各位大神 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)

https://ithelp.ithome.com.tw/upload/images/20190520/20117436W7uy2aohQU.png

2 個回答

2
ccutmis
iT邦研究生 4 級 ‧ 2019-05-20 12:20:08
最佳解答

恭喜樓主...總算到最後一哩路了~加油!
下列這段代碼給您參考...

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就行了,這部份您應該自己能處理。

看更多先前的回應...收起先前的回應...
froce iT邦大師 7 級 ‧ 2019-05-20 12:36:56 檢舉

學 comprehension 和 map、filter、reduce 可以省很多code。XD
像他這個我就完全不想用迴圈寫,很煩。

ccutmis iT邦研究生 4 級 ‧ 2019-05-20 12:47:04 檢舉

但是這樣對新手比較好理解 /images/emoticon/emoticon82.gif

froce iT邦大師 7 級 ‧ 2019-05-20 12:50:32 檢舉

所以我有給關鍵字出來啊,他有興趣自己去查。XD
懂了以後慢慢就會看的懂,寫得出來了。

ccutmis iT邦研究生 4 級 ‧ 2019-05-20 13:24:27 檢舉

/images/emoticon/emoticon77.gif

好的 我會去查的 我會慢慢學習 可是有人用過graphviz嗎?我發現用這個來畫,0到9都還ok,一到10就會跳錯欸,這個部份可以解決嗎

froce iT邦大師 7 級 ‧ 2019-05-20 13:45:06 檢舉

看了一下文件,你這種編碼方式只能用一個字元。
要用下面這種方式才能。

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到時候又丟更難的難題給你,你就更慘。

ccutmis iT邦研究生 4 級 ‧ 2019-05-20 13:51:33 檢舉

沒有用過graphviz... /images/emoticon/emoticon04.gif
善用google搜尋大法,
跳錯的訊息你可以試試在 google 用英文關鍵字搜
例如:
graphviz "你遇到跳錯的訊息(英文的)"
如果跟程式有關的可以再加" stackoverflow " 下去搜看看

我大概修完了 不過我沒看你們的改:)
我先嘗試靠自己
我修完之後 他跳這個錯欸
dot: graph is too large for cairo-renderer bitmaps. Scaling by 0.661051 to fit
好像是說 圖片太大了
我上網查說-T svg這個指令可以使用 問題是要如何用在python 裡呢

froce iT邦大師 7 級 ‧ 2019-05-20 19:20:38 檢舉
ccutmis iT邦研究生 4 級 ‧ 2019-05-21 09:05:37 檢舉

關於"-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 沒試過 這部份樓主可以自己試試看

好的 感謝

froce iT邦大師 7 級 ‧ 2019-05-21 14:44:50 檢舉

上面給的連結就有可以改的地方啊,不用用到os去直接執行指令

dot.format = 'svg'

謝謝大家喔
我程式寫出來了
這次是個很棒的經驗

0
froce
iT邦大師 7 級 ‧ 2019-05-20 10:57:48

依你的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)

https://ideone.com/1Cc5DK

..那要怎模用出來呢

我要發表回答

立即登入回答