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