首页 > 解决方案 > 我怎样才能对这些数据进行排序,就好像它在字典中一样?

问题描述

我有这个文本文件,其中有某些产品,每个产品都有它们可用的商店。商店线以tab字符开头,产品线则没有。

为了能够以更好的方式对其进行可视化,我想将其作为字典进行排序,以商店名称为键,然后是产品列表。一个例子是:

{
    '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']),..)

标签: pythondictionary

解决方案


您在解析文件时遇到一些问题。考虑到数据的格式,您应该坐下来尝试了解您要完成的工作。

该文件由可以被视为一组的行组成:

  • 包含产品名称的非缩进行
  • 后跟包含该产品的商店的缩进行

因此,当您阅读产品时,您应该记住该产品,直到阅读新产品。

对于您阅读的每个商店,您应该将产品添加到该商店可用的产品列表中。为此,您需要一个字典,其中键是商店名称,值是产品。

请记住,在尝试附加产品之前,您必须检查商店是否存在于字典中。

解决它的一种方法是:

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']

当然,您应该根据自己的需要进行调整。你说了一些关于使用有序集合的事情。一切就绪后,对元素进行排序应该是微不足道的。


推荐阅读