首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3将数据文件转换为每个键具有多个值的字典并显示它

Python 3将数据文件转换为每个键具有多个值的字典并显示它
EN

Stack Overflow用户
提问于 2016-11-28 23:44:40
回答 3查看 255关注 0票数 0

我到处找答案,却找不到答案。我有一个具有以下键/值的数据文件:

代码语言:javascript
复制
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

我需要能够显示这个输出:

代码语言:javascript
复制
>>> 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

我知道我可以将文件作为一个列表加载到

代码语言:javascript
复制
with open('tea.txt') as f:
   teas = f.read().splitlines()

我不知道如何将列表转换为具有多个值的单键的dict。任何帮助都是非常感谢的。

编辑:我现在知道如何得到列表并转换成字典了。谢谢你们!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-29 00:10:39

处理这个问题有很多不同的方法。我会教你一种阅读茶叶的方法。

代码语言:javascript
复制
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:]

如果需要每个列表的数值,则可以将它们映射到适当的数据类型。下面是两个示例,说明如何更改最后一行以获得数字列表/数组。

  • 您可以通过简单的内置函数来完成这一任务: teas[t] =map(浮点,t1:)
  • 或者,您可以使用numpy数组。 进口冷气#..。teas[t] = numpy.array(t1:,dtype=float)

最终的字典如下所示:

代码语言:javascript
复制
{'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)}
票数 0
EN

Stack Overflow用户

发布于 2016-11-29 00:05:07

获取数据的最简单方法是:

代码语言:javascript
复制
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])))

票数 2
EN

Stack Overflow用户

发布于 2016-11-29 00:00:05

为此,您可以很容易地使用pandas

代码语言:javascript
复制
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)

结果如下:

代码语言:javascript
复制
>>> 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,只需做:

代码语言:javascript
复制
>>> 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中完成所需的任务,

代码语言:javascript
复制
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理解:

代码语言:javascript
复制
>>> 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']}

最后,最后得到你的累计销售额:

代码语言:javascript
复制
for tea in teas_dict:
    total_sales = sum(map(float, teas_dict[tea]))
    teas_dict[tea].append(total_sales)

结果:

代码语言:javascript
复制
>>> 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]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40855467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档