Python 菜鸡请教

2018-06-15 10:12:53 +08:00
 wsds

有这么一堆数据:

#test.log
a, 1.324171
b, 0.000126
c, 1.970941
a, 1.469649
b, 0.000124
c, 0.512929
a, 1.290920
b, 0.000118
c, 0.259524
a, 0.495958
b, 0.000123
c, 0.910949
a, 1.268038
b, 0.000118
c, 1.016419
a, 1.856081
b, 0.000120
c, 1.400075
a, 1.314131
b, 0.000140

想要用 python 把左边的 key 一样的合并,但 value 要取它所有的和,还有平均值

搞了半天,发现搞不定,也是尴尬,以下还是个半成品,搞不下去了,报错,求大神指点一些简单方法

def two(file):

	arr = []
	with open(file, "r", encoding="utf-8") as f:
		for i in f.readlines():
			a = i.replace("\n", '').strip()
			if a.split(",")[0] not in arr:
				arr.append(a.split(",")[0])
	ser = -1
	while True:
		ser += 1
		try:
			if a.split(",")[ser] == arr[ser]:
				print(a.split(",")[ser])
		except IndexError:
			print("end!")
			break


two("test.log")

4678 次点击
所在节点    Python
47 条回复
imagechans
2018-06-15 11:24:19 +08:00
@imagechans 这是按照我自己的习惯写的
billgreen1
2018-06-15 11:43:25 +08:00
< test.log | awk -F"," '{total[$1]+=$2; occurence[$1]+=1}END{for (key in total) printf("%s\t %s \t %s\n", key, total[key], total[key]/occurence[key])}'
slimbloody
2018-06-15 12:09:58 +08:00
default_dict
arthasgxy
2018-06-15 12:18:33 +08:00
@lixm
http://chuantu.biz/t6/328/1529036276x-1404792211.jpg

求助,不知道为什么我这里运行会这样
arthasgxy
2018-06-15 12:36:07 +08:00
https://gist.github.com/arthasgxy/9d1f8aae0c1e90dde5ec5e44032be4f5

字典用的少,感觉只能写出来这种又蠢又长的
wsds
2018-06-15 13:31:58 +08:00
@bufpay 发现越是看上去简单的功能,实现起来越是困难
xpresslink
2018-06-15 13:59:48 +08:00
>>> data = """a, 1.324171
b, 0.000126
c, 1.970941
a, 1.469649
b, 0.000124
c, 0.512929
a, 1.290920
b, 0.000118
c, 0.259524
a, 0.495958
b, 0.000123
c, 0.910949
a, 1.268038
b, 0.000118
c, 1.016419
a, 1.856081
b, 0.000120
c, 1.400075
a, 1.314131
b, 0.000140"""
>>> import csv
>>> from itertools import groupby
>>> from operator import itemgetter as ig
>>> {k:sum(map(lambda x:float(ig(1)(x)), v)) for k, v in groupby(sorted(csv.reader(iter(data.splitlines())), key=ig(0)), key=ig(0))}
{'a': 9.018948, 'b': 0.000869, 'c': 6.070837}
>>>
Xiaobaixiao
2018-06-15 15:14:39 +08:00
from collections import defaultdict

logData='''a, 1.324171
b, 0.000126
c, 1.970941
a, 1.469649
b, 0.000124
c, 0.512929
a, 1.290920
b, 0.000118
c, 0.259524
a, 0.495958
b, 0.000123
c, 0.910949
a, 1.268038
b, 0.000118
c, 1.016419
a, 1.856081
b, 0.000120
c, 1.400075
a, 1.314131
b, 0.000140'''

def solve(logData):
logList=[]
logDict=defaultdict(int)
for line in logData.splitlines():
newList = line.split(',')
k=newList[0]
v=float(newList[1])
logList.append(k)
logDict[k]+=v
for k,v in logDict.items():
avg = v/logList.count(k)
print("{0} 总和:{1} , 平均值:{2}".format(k,v,avg))


>>> solve(logData)
a 总和:9.018948 , 平均值:1.2884211428571428
b 总和:0.000869 , 平均值:0.00012414285714285714
c 总和:6.070837 , 平均值:1.0118061666666667
zhang0320
2018-06-15 15:20:00 +08:00
with open('data.txt', 'r') as f:
data = f.read()
dict_data = {}
for i in data.split('\n'):
if i.split(',')[0] not in dict_data:
dict_data[i.split(',')[0]]=float(i.split(',')[1])
dict_data[i.split(',')[0]]=dict_data[i.split(',')[0]]+float(i.split(',')[1])

print(dict_data)



我是个新手菜鸟,不知道这种想法对不对。。。
zhang0320
2018-06-15 15:24:06 +08:00
with open('data.txt', 'r') as f:
data = f.read()
dict_data = {}
for i in data.split('\n'):
if i.split(',')[0] not in dict_data:
dict_data[i.split(',')[0]] = float(i.split(',')[1])
else:
dict_data[i.split(',')[0]] = dict_data[i.split(',')[0]] + float(i.split(',')[1])

print(dict_data)


不好意思 忘了个 else:
Alexhex
2018-06-15 15:26:18 +08:00
拷到 Excel 里一个数据透视表搞定美滋滋。
ful1v1dcker
2018-06-15 15:31:59 +08:00
什么鬼,V 站 markdown 失效了?全是代码坨啊。。。
reself
2018-06-15 15:33:22 +08:00
@araraloren 哈哈 perl 自带代码混淆
araraloren
2018-06-15 15:37:12 +08:00
@ful1v1dcker 本来就是这样,只支持楼主的。。不然还需要什么 chrome markdown 插件(外面那个帖子)
JCZ2MkKb5S8ZX9pq
2018-06-15 15:57:18 +08:00
d = {}
逐行
k, v = (i.strip() for i in text.split(','))
d.setdefault(k, []) # 建个列表
d[k].append(float(v))

这样直观一点,然后求值啥的慢慢折腾呗。
lixm
2018-06-15 16:48:31 +08:00
@arthasgxy 因为是 yield, 所以是一个生成器
gnozix
2018-06-15 17:58:27 +08:00
我意思一下:
```python
temp = {}
for i, j in dict or tuple:
if i in temp:
temp[i] = float(j)
else:
temp[i] += float(j)
```
ful1v1dcker
2018-06-15 17:58:45 +08:00
@araraloren 噢好吧,果然没用最垃圾只有更垃圾
yaorc
2018-06-15 18:26:46 +08:00
def pivot_table():
with open('data.txt', 'r') as f:
all_data = f.readlines()[1:]
keys = []
result = {}
count = {}

for data in all_data:
content = data.split(',')
key = content[0]
value = float(content[1].strip())

# 添加键
if key not in keys:
keys.append(key)
result[key] = value
count[key] = 1
else:
result[key] += value
count[key] += 1

print('元素:', keys)
print('元素个数:', count)
print('和:', result)

print('\n 统计信息(元素,和,平均值):')
for k, v in result.items():
avg = v / count[k]
print(k, v, avg)


----------输出-----------
元素: ['a', 'b', 'c']
元素个数: {'a': 7, 'b': 7, 'c': 6}
和: {'a': 9.018948, 'b': 0.000869, 'c': 6.070837}

统计信息(元素,和,平均值):
a 9.018948 1.2884211428571428
b 0.000869 0.00012414285714285714
c 6.070837 1.0118061666666667
gpj22pYlv2qYiZ8U
2018-06-15 20:53:16 +08:00
def two(file):

num_dict = {}
with open(file, "r", encoding="utf-8") as f:
for i in f.readlines():
a = i.replace("\n", '').strip()
line_list = a.split(",")
if line_list[0] not in num_dict:
num_dict[line_list[0]] = [line_list[1], 1]
else:
num_dict[line_list[0]] = [float(num_dict[line_list[0]][0]) + float(line_list[1]), int(num_dict[line_list[0]][1]) + 1]
for x in num_dict:
num_dict[x].append(num_dict[x][0] / num_dict[x][1])
print(num_dict)


two("/Users/yourname/program/test/test.log")

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/463296

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX