之前學習python,研究了一下使用c#呼叫python,現在把過程發出來給大家參考。
參考:我的開發環境是vs2017+python 2.7.15+ironpython-2.7.7(使用python3以上的版本貌似不行)
python實現協同過濾就不詳細介紹了,主要說一下除錯中碰到的問題
1、ironpython.runtime.exceptions.importexception:「no module named requests」
2、ironpython.runtime.exceptions.importexception:「cannot import name _remove_dead_weakref」
3、system.missingmemberexception:「'module' object has no attribute '_getframe'」
下面奉上原始碼:
python
c##!/usr/bin/python2
# -*- coding: utf-8 -*-
#已實現python結合c#實現協同過濾推薦演算法
import sys
import requests
import json
#self.diffs 矩陣儲存評分矩陣,
#self.freqs 儲存一對 items 被相同使用者評分的數量。
diffs = {}
freqs = {}
# 根據提供的資料,構建self.diffs / self.freqs字典
def update(data):
# 遍歷每個使用者的每個評分資料
for user, prefs in data.items():
# 確保子字典存在
for item, rating in prefs.items():
freqs.setdefault(item, {})
diffs.setdefault(item, {})
# setdefault 作用:
#如果對於給定的鍵值/setdefault的第乙個引數,
#字典中為對應value為空,
#則將setdefault的第二個引數賦值給它。
# 下面再次迴圈遍歷user對應的prefs中的每一組評分
for item2, rating2 in prefs.items():
freqs[item].setdefault(item2, 0)
diffs[item].setdefault(item2, 0.0)
# 使用整數0初始化次數,浮點型零初始化評分。
# 利用兩個item是否同時被乙個使用者評分,
#對self.freqs進行更新
freqs[item][item2] += 1
# 利用兩個item的評分之差,對self.diffs矩陣進行更新
diffs[item][item2] += rating - rating2
# 將兩個item在diffs 矩陣與 freqs矩陣對應位置相除,
#結果儲存到freqs中,即為兩個item的平均差距
for item, ratings in diffs.items():
for item2, rating in ratings.items():
ratings[item2] /= freqs[item][item2]
return "準備完成"
# 對新的使用者偏好,根據 self.diffs / self.freqs 對新使用者進行評分**
def predict(userprefs):
# 定義兩個空字典,preds儲存**資料,freqs儲存計數
preds, freqss = {}, {}
# 迭代每乙個物品(被使用者評分過的)
# 使用try/except跳過沒有被評分的物品對
for item, rating in userprefs.items():
for diffitem, diffratings in diffs.items():
try:
freq = freqs[diffitem][item]
except keyerror:
continue
# 設定preds初始值為0.0, freqs初始值為0
preds.setdefault(diffitem, 0.0)
freqss.setdefault(diffitem, 0)
# 累加
preds[diffitem] += freq * (diffratings[item] + rating)
freqss[diffitem] += freq
# 在返回結果之前,進行過濾
# 返回乙個 帶權重**值 的新字典
# 結果中除去了 使用者已經評分過的內容 和 物品計數為零的內容
return dict([(item, value / freqss[item]) for item, value in preds.items() if item not in userprefs and freqss[item] > 0])
#return dict(alice=dict(a=5.0, b=4.0,c=3.0),bob=dict(a=4.0 ,b = 5.0,c=3.0,d=5),lili=dict(a=4,b=4,d=5))
#return dict([(item, value / freqss[item]) for item, value in preds.items() if item not in userprefs ])
def collaborative_filtering():
try:
print '呼叫介面獲取json資料'
'''print('get請求獲取的響應結果json型別',r.text)
print('get請求獲取的響應結果json型別',r.text)
print("get請求獲取響應頭",r.headers['content-type'])
'''#響應的json資料轉換為可被python識別的資料型別
predict_dic={}
input_dict={}
json_r = r.json()
if(json_r["result"]==0 and len(json_r["data"])>0):
list=json.loads(json_r["data"])
predict_dic=list[str(uid)]
list.pop(str(uid))
update(list)
prediction=predict(predict_dic)
for item,rating in prediction.items():
print item+":\t"+str(rating)
print '完成'
return prediction
#print(json_r)
except exception as e:
print str(e)
return dict(msg=str(e))
var options = new dictionary();options["frames"] = true;
options["fullframes"] = true;
scriptengine pyengine = python.createengine(options);//建立python直譯器物件
dynamic py = pyengine.executefile(@"d:\\python\\call.py");//讀取指令碼檔案
ironpython.runtime.pythondictionary prediction = py.collaborative_filtering();
控制台程式裡呼叫控制台程式
現在遇到這麼個問題,我想用控制台裡呼叫控制台程式來實現多文字。但是在控制台裡呼叫控制台程式時,它不是出現新的控制台視窗顯示,而是已有的控制台裡顯示呼叫的程式,system d code 練習 jjplace editor debug editor.exe winexec d code 練習 jjpl...
C 中呼叫控制台程式時隱藏控制台視窗
有時我們在呼叫控制台程式時,不希望看到控制台視窗,在c 中可以通過以下方法實現 processstartinfo startinfo new processstartinfo e helloworld.exe startinfo.createnowindow true 不建立視窗 startinfo...
在C 中呼叫控制台程式
需求 想在c 中呼叫乙個帶有引數 dos命令 whoami,並處理返回的文字資訊 調查 一檢視 發現是個 exe 的問件,並且這個.exe可以根據不同的引數,得到不同的系統資訊 關鍵 新建了個窗體程式,在載入窗體的時候執行,只是個小demo,就不多說了 private void form1 load...