Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的pythonic方法来编写此代码?_Python - Fatal编程技术网

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

有没有更好的pythonic方法来编写此代码?,python,Python,我试图从文本文件中读取第一列和第三列,并将它们添加到一起 下面的代码工作得很好,并给出了我需要的结果,但是否有更好的、更符合python风格的方法来编写 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]) f

我试图从文本文件中读取第一列和第三列,并将它们添加到一起

下面的代码工作得很好,并给出了我需要的结果,但是否有更好的、更符合python风格的方法来编写

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]
您可以使用zip:

或者,如果您不需要持有cols:

results = [
    x+y for x, _, y in zip(*(int(x) for x in map(lambda x: x.split(','), fn))
]
您可以使用zip:

或者,如果您不需要持有cols:

results = [
    x+y for x, _, y in zip(*(int(x) for x in map(lambda x: x.split(','), fn))
]
如果您可以使用numpy,那么我的建议是使用函数:

import numpy as np
np.loadtxt('random.txt', dtype=int, skiprows=1, delimiter=',', usecols=(0, 2)).sum(axis=1).tolist()
如果您可以使用numpy,那么我的建议是使用函数:

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

除了这里提供的答案之外,您还可以使用包来处理该文件

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    
最简单的解决方案是使用,如果你对它感到舒服的话

import pandas as pd
df = pd.read_csv('random.txt')
print df.col1 + df.col2
如果要将结果作为列表


除了这里提供的答案之外,您还可以使用包来处理该文件

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    
最简单的解决方案是使用,如果你对它感到舒服的话

import pandas as pd
df = pd.read_csv('random.txt')
print df.col1 + df.col2
如果要将结果作为列表


你的代码已经够python的了,但是你做的工作和占用的空间比你需要的要多

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)

你的代码已经够python的了,但是你做的工作和占用的空间比你需要的要多

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)

我想说,最简单的方法就是坚持基本原则,没有正确的python方法!你可以让你的代码变得简单和复杂

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]

我想说,最简单的方法就是坚持基本原则,没有正确的python方法!你可以让你的代码变得简单和复杂

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]

还有一个选项具有一行列表理解功能,但我们必须使用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

还有一个选项具有一行列表理解功能,但我们必须使用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


你可能想看看熊猫。对于这个玩具示例来说,这有些过分,但对于逗号分隔值的csv文件来说效果非常好。可能有一种方法可以避免重复数字两次。您可能想看看熊猫。对于这个玩具示例来说,这太过分了,但对于逗号分隔值的csv文件来说效果非常好。可能有一种方法可以避免重复数字两次。@gt6989b似乎可读。。。转换为整数,跳过第一行,用逗号分隔,使用第一列和第三列,然后求和。@gt6989b似乎可读。。。转换为整数,跳过第一行,用逗号分割,使用第一列和第三列,求和。太棒了!“u”在第一列、第二列、第三列中有什么作用?它是一个变量名,通常用来表示忽略了该值。你可以用first\u col,second\u col,third\u col=row.split','替换它,但是当有人去读你的代码或者你使用一个linter时,他们会问你为什么不使用second\u col。看到了吗!“u”在第一列、第二列、第三列中有什么作用?它是一个变量名,通常用来表示忽略了该值。你可以用first\u col,second\u col,third\u col=row.split',',替换它,但是当有人去读你的代码或者你使用了一个linter时,他们会问你为什么不使用second\u col。请参阅。可读性很重要。简单总比复杂好。哇!谢谢你的接受:我想越简单越好!这本质上是@Unni-answer,除非您将他的列表理解转换为完整的for循环。这怎么可能更简单呢?还是更清楚?直到你现在指出,我才看到他的答案!因此,我关于更简单或更清晰的陈述与他的回答无关!我只是想说清楚,我是在评论他关于保持事情简单的说法。非常同意。可读性很重要。简单总比复杂好。哇!谢谢你的接受:我想越简单越好!这本质上是@Unni-answer,除非您将他的列表理解转换为完整的for循环。这怎么可能更简单呢?还是更清楚?直到你现在指出,我才看到他的答案!因此,我关于更简单或更清晰的陈述与他的回答无关!我只是想说清楚,我是在评论他关于让事情简单化的说法
s是纯Python中最优雅的方法,这个答案应该是公认的答案。这是纯Python中最优雅的方法,这个答案应该是公认的答案。