我试图编写代码来处理我的数字输入文件,然后对它们执行各种操作。例如,第一列是一个名称。第二个是小时费率,第三个是小时数。文件看起来像这样,
John 15 8
Sam 10 4
Mike 16 10
John 19 15
我想经历一下,如果一个名字是重复的(在本例中为John),它将平均第二个数字(每小时的费率),求和第三个数字的总和(小时),并删除重复的,剩下1个John平均工资和总时数。如果不是重复项,则只会输出原始条目。
我无法弄清楚如何跟踪重复项,然后移至该行的下一行。不用使用line.split()有什么方法吗?
答案 0 :(得分:1)
如果将其分解成多个部分,此问题会更容易。
首先,您想通读文件并将每一行解析为三个变量,即名称,每小时费率和小时数。
第二,您需要处理第一个值(名称)的匹配。您需要某种数据结构来存储值。 dict
可能是正确的选择。
第三,您需要在最后计算平均值(由于需要计数值,因此无法一路计算平均值)。
将其放在一起,我会做这样的事情:
class PersonRecord:
def __init__(self, name):
self.name = name
self.hourly_rates = []
self.total_hours = 0
def add_record(self, hourly_rate, hours):
self.hourly_rates.append(hourly_rate)
self.total_hours += hours
def get_average_hourly_rate(self):
return sum(self.hourly_rates) / len(self.hourly_rates)
def compute_person_records(data_file_path):
person_records = {}
with open(data_file_path, 'r') as data_file:
for line in data_file:
parts = line.split(' ')
name = parts[0]
hourly_rate = int(parts[1])
hours = int(parts[2])
person_record = person_records.get(name)
if person_record is None:
person_record = PersonRecord(name)
person_records[name] = person_record
person_record.add_record(hourly_rate, hours)
return person_records
def main():
person_records = compute_person_records()
for person_name, person_record in person_records.items():
print('{name} {average_hourly_rate} {total_hours}'.format(
name=person_name,
average_hourly_rate=person_record.get_average_hourly_rate(),
total_hours=person_record.total_hours))
if __name__ == '__main__':
main()
答案 1 :(得分:0)
您可以这样做:
$ perl dummy.pl 10 100 1000 10000
10: 23
100: 2318
1000: 233168
10000: 23331668
答案 2 :(得分:0)
我们在这里。 groupby
和name
上的aggregate
rate
和hours
取mean
和sum
,如下所示。>
#assume d is the name of your DataFrame.
d.groupby(by =['name']).agg({'rate': "mean", 'hours':'sum'})
答案 3 :(得分:0)
这不是一个特别有效的版本。我不会在大量数据上运行它,但是它很容易读取并将数据恢复为原始格式,这显然是您想要的...
from statistics import mean
input = '''John 15 8
Sam 10 4
Mike 16 10
John 19 15'''
lines = input.splitlines()
data = [line.split(' ') for line in lines]
names = set([item[0] for item in data])
processed = [(name, str(mean([int(i[1]) for i in data if i[0] == name])), str(sum([int(i[2]) for i in data if i[0] == name]))) for name in names]
joined = [' '.join(p) for p in processed]
line_joined = '\n'.join(joined)
答案 4 :(得分:0)
a=[] #list to store all the values
while(True): #infinite while loop to take any number of values given
try: #for giving any number of inputs u want
l=input().split()
a.append(l)
except(EOFError):
break;
for i in a:
m=[i] #temperory list which will contain duplicate values
for j in range(a.index(i)+1,len(a)):
if(i[0]==a[j][0]):
m.append(a[j]) #appending duplicates
a.pop(j) #popping duplicates from main list
hr=0 #initializing hourly rate and hours with 0
hrs=0
if(len(m)>1):
for k in m:
hr+=int(k[1])
hrs+=int(k[2])# calculating total hourly rate and hours
i[1]=hr/len(m)
i[2]=hrs/len(m)#finding average
for i in a:
print(i[0],i[1],i[2]) # printing the final list
阅读代码中的注释以进行代码解释