我到处找答案,却找不到答案。我有一个具有以下键/值的数据文件:
oolong:8580.0:7201.25:8900.0
earl grey:10225.25:9025.0:9505.0
green:6700.1:5012.45:6011.0
mint:9285.15:8276.1:8705.0
jasmine:7901.25:4267.0:7056.5数据如下所示- tea_name:store1_Sales:store2_Sales:store3_Sales
我需要能够显示这个输出:
>>> earl grey 10225.25 9025.00 9505.00 28755.25
green 6700.10 5012.45 6011.00 17723.55
jasmine 7901.25 4267.00 7056.50 19224.75
mint 9285.15 8276.10 8705.00 26266.25
oolong 8580.00 7201.25 8900.00 24681.25
42691.75 33781.80 40177.50我知道我可以将文件作为一个列表加载到
with open('tea.txt') as f:
teas = f.read().splitlines()我不知道如何将列表转换为具有多个值的单键的dict。任何帮助都是非常感谢的。
编辑:我现在知道如何得到列表并转换成字典了。谢谢你们!
发布于 2016-11-29 00:10:39
处理这个问题有很多不同的方法。我会教你一种阅读茶叶的方法。
teas = {}
with open('tea.txt') as f:
# step through the file, line by line,
# so that you don't read in a huge file all at once
for line in f:
# split the line by your delimiter ':'
t = line.split(':')
# create your dictionary with a key, value pair
teas[t[0]] = t[1:]如果需要每个列表的数值,则可以将它们映射到适当的数据类型。下面是两个示例,说明如何更改最后一行以获得数字列表/数组。
numpy数组。
进口冷气#..。teas[t] = numpy.array(t1:,dtype=float)最终的字典如下所示:
{'earl grey': (10225.25, 9025.0, 9505.0),
'green': (6700.1, 5012.45, 6011.0),
'jasmine': (7901.25, 4267.0, 7056.5),
'mint': (9285.15, 8276.1, 8705.0),
'oolong': (8580.0, 7201.25, 8900.0)}发布于 2016-11-29 00:05:07
获取数据的最简单方法是:
with open('1.txt') as f:
data = {}
for row in f:
row = row.strip().split(':')
data[row[0]] = row[1:]
for key, value in data.items():
print('%s %s %s' % (key, ' '.join(value), sum([float(v) for v in value])))
发布于 2016-11-29 00:00:05
为此,您可以很容易地使用pandas:
import pandas as pd
from io import StringIO
# makes it easy to read globs of text like the data you posted above
data = StringIO('''oolong:8580.0:7201.25:8900.0
earl grey:10225.25:9025.0:9505.0
green:6700.1:5012.45:6011.0
mint:9285.15:8276.1:8705.0
jasmine:7901.25:4267.0:7056.5''')
df = pd.read_csv(data, sep = ':', header = None)
# returns a list of column names from the string you have above
df.columns = "tea_name:store1_Sales:store2_Sales:store3_Sales".split(':')
# add up the sales for stores 1, 2, and 3 for each type of tea to get total sales for a given tea
df['total_sales'] = df[['store1_Sales', 'store2_Sales', 'store3_Sales']].sum(axis = 1)结果如下:
>>> df
tea_name store1_Sales store2_Sales store3_Sales total_sales
0 oolong 8580.00 7201.25 8900.0 24681.25
1 earl grey 10225.25 9025.00 9505.0 28755.25
2 green 6700.10 5012.45 6011.0 17723.55
3 mint 9285.15 8276.10 8705.0 26266.25
4 jasmine 7901.25 4267.00 7056.5 19224.75编辑:要从这个dict对象获得一个pandas.DataFrame,只需做:
>>> df.to_dict()
{'store1_Sales': {0: 8580.0, 1: 10225.25, 2: 6700.1000000000004, 3: 9285.1499999999996, 4: 7901.25}, 'tea_name': {0: 'oolong', 1: 'earl grey', 2: 'green', 3: 'mint', 4: 'jasmine'}, 'total_sales': {0: 24681.25, 1: 28755.25, 2: 17723.549999999999, 3: 26266.25, 4: 19224.75}, 'store3_Sales': {0: 8900.0, 1: 9505.0, 2: 6011.0, 3: 8705.0, 4: 7056.5}, 'store2_Sales': {0: 7201.25, 1: 9025.0, 2: 5012.4499999999998, 3: 8276.1000000000004, 4: 4267.0}}Edit2:忽略pandas,您可以像这样在基本Python中完成所需的任务,
teas_dict = {}
for row in teas:
row_list = row.split(':')
tea = row_list[0] # tea name is always the first element in a row
sales = row_list[1:] # remaining elements in row_list are sales data
teas_dict[tea] = sales等效地,使用dict理解:
>>> teas_dict = {row.split(':')[0]: row.split(':')[1:] for row in teas}
>>> teas_dict
{'earl grey': ['10225.25', '9025.0', '9505.0'], 'green': ['6700.1', '5012.45', '6011.0'], 'oolong': ['8580.0', '7201.25', '8900.0 '], 'mint': ['9285.15', '8276.1', '8705.0'], 'jasmine': ['7901.25', '4267.0', '7056.5']}最后,最后得到你的累计销售额:
for tea in teas_dict:
total_sales = sum(map(float, teas_dict[tea]))
teas_dict[tea].append(total_sales)结果:
>>> teas_dict
{'earl grey': ['10225.25', '9025.0', '9505.0', 28755.25], 'green': ['6700.1', '5012.45', '6011.0', 17723.55], 'oolong': ['8580.0', '7201.25', '8900.0 ', 24681.25], 'mint': ['9285.15', '8276.1', '8705.0', 26266.25], 'jasmine': ['7901.25', '4267.0', '7056.5', 19224.75]}https://stackoverflow.com/questions/40855467
复制相似问题