是否可以使用相同的map reduce?
在python中转换此js代码var fs = require('fs')
var output = fs.readFileSync('data.txt', 'utf8')
.trim()
.split('\n')
.map(line => line.split('\t'))
.reduce((orders, line) => {
orders[line[0]] = orders[line[0]] || []
orders[line[0]].push({
name: line[1],
price: line[2],
quantity: line[3]
})
return orders
}, {})
console.log(output)
到目前为止,我只有地图部分代码:
txt = open('data.txt').read()
mylist = map(lambda x: x.split('\t'), txt.strip().split('\n'))
不确定是否可以在lambda / list comp中执行此操作。任何方式都可以。谢谢你们!
----更新1 ---- 感谢@Univerio的回答
额外学习。你们有什么想法吗?这个问题被称为{}
的NoneTypewith open("data.txt") as txt:
output = reduce(lambda x,y : x.setdefault(y[0], []).append({"name": y[1], "price": y[2], "quantity": y[3]}).items(),\
map(lambda x: x.split('\t'), txt.read().strip().split('\n')),\
{})
print output
----更新2 ----
嗯,这很难看。但是让它使用相同的地图reduce。
def update_orders(orders, line):
orders.setdefault(line[0], []).append({"name": line[1], "price": line[2], "quantity": line[3]})
#orders[line[0]] = orders.get(line[0], []) + [{"name": line[1], "price": line[2], "quantity": line[3]}]
return orders
with open("data.txt") as txt:
output = reduce(lambda x,y : update_orders(x, y),\
map(lambda x: x.split('\t'), txt.read().strip().split('\n')),\
{})
print output
答案 0 :(得分:1)
在Python(IMO,无论如何)中使用循环代替reduce
更具惯用性。您还可以通过以下方式利用流式文件访问:
with open("data.txt") as f:
output = {}
for line in f:
key, name, price, quantity = line.strip().split("\t")
output.setdefault(key, []).append({"name": name, "price": price, "quantity": quantity})
这并没有完全完全 JS版本在空格处理方面所做的事情,但它对于理智的输入应该没问题。