JS到python lambda / list comp转换

时间:2016-02-11 02:08:29

标签: python dictionary reduce

是否可以使用相同的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的回答

额外学习。你们有什么想法吗?这个问题被称为{}

的NoneType
with 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

1 个答案:

答案 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版本在空格处理方面所做的事情,但它对于理智的输入应该没问题。