2017-05-11 180 views
1

我想将现有的python函数转换为lua函数。但我的lua函数并不像python函数那样产生相同的结果。任何帮助表示赞赏。将Python函数转换为Lua函数

Python函数:

import json 

test = '{"http://localhost:8080/":{"phone":{"-detail/phone detail.template.html":"5167n,a,7,2","s/motorola-xoom-with-wifi.json":"516a0,5,4,3"},"favicon.ico":"016ad,3,3,2","img/phones/motorola-xoom-with-wi-fi.":{"1.jpg":"*02s,2s,4v,h3|116da,o,l,6","2.jpg":"*02s,2s,4v,kp|116da,j,i,8","3.jpg":"*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7","4.jpg":"*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7","5.jpg":"*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7"}}}' 


def tri(param): 
    t = {} 
    for key in param: 
    if key not in param: 
     continue 
    if isinstance(param[key], dict) and param[key] is not None: 
     flat = tri(param[key]) 
     for x in flat: 
      if x not in flat: 
       continue 
      t[key + x] = flat[x] 
    else: 
     t[key] = param[key] 
return t 


print(tri(json.loads(test))) 

Lua代码(其不产生相同的结果蟒功能)

local json = require('cjson') 

local test = '{"http://localhost:8080/":{"phone":{"-detail/phone-detail.template.html":"5167n,a,7,2","s/motorola-xoom-with-wi-fi.json":"516a0,5,4,3"},"favicon.ico":"016ad,3,3,2","img/phones/motorola-xoom-with-wi-fi.":{"1.jpg":"*02s,2s,4v,h3|116da,o,l,6","2.jpg":"*02s,2s,4v,kp|116da,j,i,8","3.jpg":"*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7","4.jpg":"*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7","5.jpg":"*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7"}}}' 

local function tri(param) 
    t = {} 
    for key in pairs(param) do 
     if param[key] == nil then end 
     if type(param[key]) == "table" then 
     flat = tri(param[key]) 
     for k in pairs(flat) do 
      t[key .. k] = flat[k] 
     end 
     else 
     t[key] = param[key] 
     end 
    end 
    return t 
end 


print(json.encode(tri(json.decode(test)))) 
+1

如果你告诉人们该函数应该做什么以及它做什么,变量应该是可能的。只要让你自己清楚你的表t发生了什么,因为每当你调用tri()时它就是全局的。 – Piglet

回答

3
local function tri(param) 
    t = {}   -- every time we call tri t will be "reset" to an empty table 
    for key in pairs(param) do 
     if param[key] == nil then end 
     if type(param[key]) == "table" then 
     flat = tri(param[key]) -- here we call tri, but we still need t! 
     for k in pairs(flat) do 
      t[key .. k] = flat[k] 
     end 
     else 
     t[key] = param[key] 
     end 
    end 
    return t 
end 

制作至少t全球应该解决这个问题。但是flat也没有理由成为全球性的,所以我们也使它成为本地的。

local function tri(param) 
    local t = {} 
    for key in pairs(param) do 
     if param[key] == nil then end 
     if type(param[key]) == "table" then 
     local flat = tri(param[key]) 
     for k in pairs(flat) do 
      t[key .. k] = flat[k] 
     end 
     else 
     t[key] = param[key] 
     end 
    end 
    return t 
end 
+0

谢谢。有效。 –

1

你的任务可以用json.traverse()功能从this Lua的JSON模块来完成更容易一点。
遍历可让您随时使用JSON元素执行任意操作。

此代码连接元素的路径(对于除JSON容器之外的每个JSON元素:数组/对象)并将其用作Lua表的键。

local json = require'json' 

local t = {} 

local function callback(path, json_type, value) 
    if value ~= nil then -- value == nil for containers (arrays/objects) 
     t[table.concat(path)] = value 
    end 
end 

local test = '{"http://localhost:8080/":{"phone":{"-detail/phone detail.template.html":"5167n,a,7,2","s/motorola-xoom-with-wifi.json":"516a0,5,4,3"},"favicon.ico":"016ad,3,3,2","img/phones/motorola-xoom-with-wi-fi.":{"1.jpg":"*02s,2s,4v,h3|116da,o,l,6","2.jpg":"*02s,2s,4v,kp|116da,j,i,8","3.jpg":"*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7","4.jpg":"*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7","5.jpg":"*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7"}}}' 

json.traverse(test, callback) 

-- Now t == { 
-- ["http://localhost:8080/favicon.ico"] = "016ad,3,3,2", 
-- ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.1.jpg"] = "*02s,2s,4v,h3|116da,o,l,6", 
-- ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.2.jpg"] = "*02s,2s,4v,kp|116da,j,i,8", 
-- ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.3.jpg"] = "*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7", 
-- ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.4.jpg"] = "*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7", 
-- ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.5.jpg"] = "*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7", 
-- ["http://localhost:8080/phone-detail/phone detail.template.html"] = "5167n,a,7,2", 
-- ["http://localhost:8080/phones/motorola-xoom-with-wifi.json"] = "516a0,5,4,3" 
-- }