python - 我怎样才能对这些数据进行排序,就好像它在字典中一样?
问题描述
我有这个文本文件,其中有某些产品,每个产品都有它们可用的商店。商店线以tab字符开头,产品线则没有。
为了能够以更好的方式对其进行可视化,我想将其作为字典进行排序,以商店名称为键,然后是产品列表。一个例子是:
{
'Store1' : ['product1', 'product2'],
'Store2' : ...
}
这是我拥有的数据示例,为每个产品存储:
- Crucial 铂胜 BLT8G4D26BFT4K
- 信息技术
- 毕普
- 电脑厂
- 我的盒子
- 爱国者签名线 PSD48G266681
- 电脑快递
- 索洛瑟维
- 金士顿 KCP426NS6/8
- 优科
- 毕普
预期的输出必须是这样的(打印得很漂亮):
{
'Infor-Ingen' : ['Crucial Ballistix BLT8G4D26BFT4K' ],
'Bip' : ['Crucial Ballistix BLT8G4D26BFT4K',
'Kingston KCP426NS6/8' ],
'PC Factory' : ['Crucial Ballistix BLT8G4D26BFT4K' ],
'MyBox' : ['Crucial Ballistix BLT8G4D26BFT4K' ],
'PC Express' : ['Patriot Signature Line PSD48G266681' ],
'Soluservi' : ['Patriot Signature Line PSD48G266681' ],
'YouTech' : ['Kingston KCP426NS6/8' ]
}
我有这个代码
from collections import OrderedDict
od = OrderedDict()
tienda, producto ,otra,aux,wea= [], [],[], [],[]
with open("rams.txt","r") as f:
data = f.readlines()
for linea in data:
linea = linea.strip('\n')
if '\t' in linea:
tienda.append(linea.strip('\t'))
aux.append(linea.strip("\t").strip("\n"))
else:
otra.append(aux)
aux=[]
producto.append(linea)
aux.append(linea.strip("\n"))
tienda = sorted(list(set(tienda)))
for i in range(1,len(otra)):
wea=[]
for key in tienda:
if key in otra[i]:
wea.append(otra[i][0])
od[key] = wea
现在的问题是,在打印字典时,它给了我这样的信息:
('Bip', ['Crucial Ballistix BLT8G4D26BFT4K ']), ('Infor-Ingen', ['Crucial Ballistix BLT2K8G4D26BFT4K ']), ('MyBox', ['Crucial Ballistix CT16G4DFD8266']),..)
解决方案
您在解析文件时遇到一些问题。考虑到数据的格式,您应该坐下来尝试了解您要完成的工作。
该文件由可以被视为一组的行组成:
- 包含产品名称的非缩进行
- 后跟包含该产品的商店的缩进行
因此,当您阅读产品时,您应该记住该产品,直到阅读新产品。
对于您阅读的每个商店,您应该将产品添加到该商店可用的产品列表中。为此,您需要一个字典,其中键是商店名称,值是产品。
请记住,在尝试附加产品之前,您必须检查商店是否存在于字典中。
解决它的一种方法是:
products_by_store = dict()
with open("rams.txt","r") as f:
cur_prod = None
data = f.readlines()
for linea in data:
linea = linea.strip('\n')
if '\t' in linea:
linea = linea.strip('\t')
if cur_prod:
if not linea in products_by_store:
products_by_store[linea] = [cur_prod]
else:
products_by_store[linea].append(cur_prod)
else:
cur_prod = linea
for k,v in products_by_store.items():
print(k, v)
这将返回以下输出:
Infor-Ingen ['Crucial Ballistix Tactical Tracer BLT8G4D26BFT4K']
Bip ['Crucial Ballistix Tactical Tracer BLT8G4D26BFT4K', 'Kingston KCP426NS6/8']
PC Factory ['Crucial Ballistix Tactical Tracer BLT8G4D26BFT4K']
MyBox ['Crucial Ballistix Tactical Tracer BLT8G4D26BFT4K']
PC Express ['Patriot Signature Line PSD48G266681']
Soluservi ['Patriot Signature Line PSD48G266681']
YouTech ['Kingston KCP426NS6/8']
当然,您应该根据自己的需要进行调整。你说了一些关于使用有序集合的事情。一切就绪后,对元素进行排序应该是微不足道的。
推荐阅读
- machine-learning - 机器学习模型的部署 - 数据版本控制
- android - 我希望仅在收到实时数据后才调用函数
- c++ - 英特尔集成性能原语傅里叶变换幅度
- database - 什么是存储文件的最佳 nosql 数据库仅包含整数列表
- amazon-dynamodb - DynamoDb 嵌套地图更新
- php - Laravel 7:foreach 循环中未定义的变量
- mongodb - MongoDB Golang 驱动程序尝试连接到 localhost 而不是 docker 主机
- .net - Windows 窗体应用程序设置任务计划程序以运行一些已包含在此应用程序中的类的更好方法是什么?(。网)
- javascript - Googlemaps按类名放置自动完成 - JS循环问题
- visual-studio - Visual Studio 可以为解决方案生成创建报告吗?