如何基于指标序列汇总字符串长度序列

时间:2019-04-12 23:52:25

标签: python-3.x

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

我想基于另一个列表中的指示符来计算一个列表的字符串长度。

很难解释问题是单词,所以让我们看一个例子。

这是示例字典:

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

现在,我想根据“类型序列”的条件,向字典中添加一个与“品牌字符串序列”的字符串累积长度相对应的项目。

这是标准:

如果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”。即。 ['B','I','I','I','I','I','I',...,'O'],所以我正在寻找一种在这种情况下可靠的解决方案情况。 谢谢

1 个答案:

答案 0 :(得分:3)

您可以使用拉链功能将品牌绑在一起并打字。然后,当您循环浏览字典值时,只需保持运行总计即可。该解决方案将支持品牌列表中的任何长度系列和任何长度的字符串。我假设是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]