我有一本有两个键的字典,它们的值是字符串列表。
我想基于另一个列表中的指示符来计算一个列表的字符串长度。
很难解释问题是单词,所以让我们看一个例子。
这是示例字典:
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'],所以我正在寻找一种在这种情况下可靠的解决方案情况。 谢谢
答案 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]