我有一个文本文件,其中有一些特定的产品,每个产品都有可供购买的商店。存储行以选项卡开始,而产品行不以字符开始
为了能够以更好的方式对其进行可视化,我想将其作为字典订购,并将商店名称作为键,后跟产品列表。例如:
{
'Store1' : ['product1', 'product2'],
'Store2' : ...
}
这是我为每种产品存储的数据示例:
预期的输出必须如下所示(打印精美):
{
'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']),..)
第一件事-关于在类上使用
print()
,请记住__str__()
的普遍接受的用途(这就是print()
所称的编织它的魔力)。它是一种人类可读的对象表示因此
OrderedDict
的默认__str__()
正是做了想要做的事。这不一定是您希望看到的特定的案例,但解决方案是认识到这最好作为OrderedDict
的抽象Python(作为一种面向对象的语言)的一部分功能是它能够基于当前类定义新的类,这些类可以添加任何您想要的额外行为或状态
对于您的情况,我将实现一个
OrderedDict
子类,并更改__str__()
的输出以生成您需要的任何格式,例如:您会注意到,我还对文件加载程序方法做了一些相当大的更改,而不仅仅是将其作为类的方法
原始文件加载代码不需要像当前那样复杂。具体地说,您可以通过动态构建列表字典(希望代码中的注释能够解释事情)来摆脱所有这些临时列表
我使用了以下
infile.txt
测试文件(在车间生产线的开头有一个选项卡):输出如下所示,与您的要求非常接近:
解析文件时遇到一些问题。考虑到数据的格式,您应该坐下来试着理解您想要完成的是什么
该文件由行组成,这些行可被视为一组:
所以,当你阅读一个产品时,你应该记住这个产品,直到一个新产品被阅读
对于您阅读的每个商店,您应该将该产品添加到商店可用的产品列表中。为此,您需要一个字典,其中键是商店名称,值是产品
请记住,在尝试附加产品之前,必须检查字典中是否存在存储
解决这个问题的一个方法是:
将返回以下输出:
当然,你应该根据自己的需要进行调整。你说了一些关于使用有序集合的事情。一旦一切就绪,对元素进行排序应该很简单
相关问题 更多 >
编程相关推荐