【问题标题】:How to aggregate string length sequence base on an indicator sequence如何根据指标序列聚合字符串长度序列
【发布时间】:2019-09-03 18:11:34
【问题描述】:

我有一个包含两个键的字典,它们的值是字符串列表。

我想根据另一个列表中的指标计算一个列表的字符串长度。

这个问题很难用文字来表达,所以让我们看一个例子。

这是一个示例字典:

thisdict ={
  'brand': ['Ford','bmw','toyota','benz','audi','subaru','ferrari','volvo','saab'],
  'type': ['O','B','O','B','I','I','O','B','B']
}

现在,我想根据“type-sequence”的条件向字典中添加一个与“brand-string-sequence”的字符串累积长度相对应的项目。

这是标准:

如果 type = 'O',则为该索引设置字符串长度 = 0。

如果type = 'B',设置字符串长度为对应的字符串长度。

如果 type = 'I',那就是事情变得复杂的时候。您可能希望回顾序列并总结字符串长度,直到到达第一个“B”。

这是一个示例输出:

thisdict ={
  "brand": ['Ford','bmw','toyota','benz','audi','subaru','ferrari','volvo','saab'],
  'type': ['O','B','O','B','I','I','O','B','B'],
  'cumulative-length':[0,3,0,4,8,14,0,5,4]  
}

其中 8=len(benz)+len(audi) 和 14=len(benz)+len(audi)+len(subaru)

请注意,在我正在处理的实际数据中,序列可以是一个“B”,后跟任意数量的“I”。 IE。 ['B','I','I','I','I','I','I',...,'O'] 所以我正在寻找一种在这种情况下稳健的解决方案情况。 谢谢

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    您可以使用 zip 功能将品牌和类型绑定在一起。然后在遍历字典值时保持运行总计。此解决方案将支持品牌列表中的任意长度系列和任意长度字符串。我假设len(thisdict['brand']) == len(thisdict['type'])

    thisdict = {
      'brand': ['Ford','bmw','toyota','benz','audi','subaru','ferrari','volvo','saab'],
      'type': ['O','B','O','B','I','I','O','B','B']
    }
    
    lengths = []
    running_total = 0
    for b, t in zip(thisdict['brand'], thisdict['type']):
    
        if t == 'O':
            lengths.append(0)
    
        elif t == 'B':
            running_total = len(b)
            lengths.append(running_total)
    
        elif t == 'I':
            running_total += len(b)
            lengths.append(running_total)
    
    print(lengths)
    # [0, 3, 0, 4, 8, 14, 0, 5, 4]
    

    生成随机数据

    import random
    import string
    
    def get_random_brand_and_type():
    
        n = random.randint(1,8)
        b = ''.join(random.choice(string.ascii_uppercase) for _ in range(n))
        t = random.choice(['B', 'I', 'O'])
    
        return b, t
    
    thisdict = {
        'brand': [],
        'type': []
    }
    
    for i in range(random.randint(1,20)):
        b, t = get_random_brand_and_type()
        thisdict['brand'].append(b)
        thisdict['type'].append(t)
    

    产生以下结果:

    {'type': ['B', 'B', 'O', 'I', 'B', 'O', 'O', 'I', 'O'], 
     'brand': ['O', 'BSYMLFN', 'OF', 'SO', 'KPQGRW', 'DLCWW', 'VLU', 'ZQE', 'GEUHERHE']}
    [1, 7, 0, 9, 6, 0, 0, 9, 0]
    

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 2018-02-23
      • 2020-07-06
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多