有没有更好的pythonic方式来编写此代码?

时间:2019-05-01 03:39:54

标签: python

我正在尝试从文本文件中读取第一列和第三列,并将它们添加在一起。

下面的代码可以完美地工作,并为我提供所需的结果,但是尝试找出是否有更好的pythonic方式编写此代码?

with open('random.txt', 'r') as fn:
    next(fn)
    numbers = fn.readlines()
    first_col = [int(x.split(',')[0]) for x in numbers]
    third_col = [int(y.split(',')[2]) for y in numbers]

    result = [v + z for v, z in zip(first_col, third_col)]

    print(result)

随机文件实际上是随机文件。

col1,col2,col3
44,65,78
55,87,98
12,32,62

结果:

[122, 153, 74]

7 个答案:

答案 0 :(得分:5)

如果可以使用numpy,那么我的建议是使用loadtxt函数:

import numpy as np
np.loadtxt('random.txt', dtype=int, skiprows=1, delimiter=',', usecols=(0, 2)).sum(axis=1).tolist()

答案 1 :(得分:3)

您可以使用linebreaks<br/>waw

zip

或者如果您不需要按住cols:

with open('random.txt', 'r') as fn:
    next(fn)
    first_col, _, third_col  = [
        *zip(*(int(x) for x in map(lambda x: x.split(','), fn))
    ]
    ...
    results = [x+y for x, y in zip(first_col, second_col)]

答案 2 :(得分:2)

除了此处提供的答案之外,您还可以使用csv包来处理文件。

import csv
with open('random.txt', 'r') as fn:
    csv_reader = csv.reader(fn)
    next(csv_reader, None)  # skip the headers
    result = [int(f)+int(t) for f,_, t in csv_reader] 
    print result    

最简单的解决方案是,如果您愿意使用pandas

import pandas as pd
df = pd.read_csv('random.txt')
print df.col1 + df.col2

如果您希望结果为list

import pandas as pd
df = pd.read_csv('random.txt')
res =  df.col1 + df.col2
print res.tolist()

答案 3 :(得分:2)

您的代码足够“ pythonic”,但是您需要做的工作和占用的空间都比您需要的多。

with open('random.txt', 'r') as fn:
    next(fn) # skip the first row
    total = 0
    for row in fn:
        first_col, _, third_col = row.split(',')
        total += int(first_col) + int(third_col)

print(result)

也许可以用一个函数来整理一下

def sum_row(row):
    first_col, _, third_col = row.split(',')
    return int(first_col) + int(third_col)

with open('random.txt', 'r') as fn:
    next(fn) # skip the first row
    result = sum(sum_row(row) for row in fn)

print result

如果您需要工业强度解决方案,即其他人也正在使用此解决方案,并且将来可能需要对其进行维护,请使用csv。

import csv

def sum_row(row):
    return int(row[0]) + int(row[2])

with open('random.txt', 'r') as fn:
    reader = csv.reader(fn)
    result = sum(sum_row(row) for row in fn)

答案 4 :(得分:2)

我想说,最简单的方法就是坚持基础知识,没有正确的pythonic方法!您可以使代码变得既简单又复杂。

import csv

res = []
with open('file.txt', 'r') as fp:
    #Open csv file
    reader = csv.reader(fp)
    next(reader)
    #Iterate through rows and append the sum of first and third rows to a list
    for row in reader:
        res.append(int(row[0]) + int(row[2]))

print(res)
#[122, 153, 74]

答案 5 :(得分:1)

import sys
import csv

with open(sys.argv[1]) as fh:
    reader = csv.reader(fh)
    rows = [list(map(int, row)) for row in reader]
    sums = [v + z for v, _, z in rows]
    print(sums)  # [122, 153, 74]

答案 6 :(得分:1)

还有一种具有单行列表理解的选项,但是我们必须使用methodcaller高阶函数来从文件中拆分每一行。

列表理解从文件中获取行,然后map函数对每个文件执行一个split(",")方法,将其转换为列列表。

from operator import methodcaller
with open('random.txt','r') as f:
    next(f)
    sum = [ int(c1)+int(c3) for c1,_,c3 in map(methodcaller("split", ","),f)]
sum  

另一个优点是我们可以将其转换为生成器而不会浪费任何内存。

from operator import methodcaller
with open('data','r') as f:
    next(f)
    v = ( int(c1)+int(c3) for c1,_,c3 in map(methodcaller("split", ","),f))
    print(list(v)) # just to print the result