迭代通过与条件字典列表
假设这其中test是字典的大列表(这只是一个示例):迭代通过与条件字典列表
test = [
{'alignedWord': 'welcome',
'case': 'success',
'end': 0.9400000000000001,
'start': 0.56
'word': 'Welcome'},
{'alignedWord': 'to',
'case': 'success',
'end': 1.01,
'start': 0.94,
'word': 'to'},
{'alignedWord': 'story',
'case': 'not-found-in-audio',
'word': 'Story'},
{'alignedWord': 'in',
'case': 'success',
'end': 1.4100000000000001,
'start': 1.34,
'word': 'in'},
{'alignedWord': 'a',
'case': 'success',
'end': 1.44,
'start': 1.41,
'word': 'a'},
{'alignedWord': 'bottle',
'case': 'success',
'end': 1.78,
'start': 1.44,
'word': 'Bottle'} ]
输出作为箱子`每个连续组块的JSON文件==”成功和duration_s < 10:
Output:
{"text": "Welcome to", "duration_s": 0.45}
{"text": "in a bottle", "duration_s': 0.44}
duration = ('end' - 'start') #of the text
我在列表中的TE的中间增加了一个新的字典没有start
和end
键st,现在为你工作吗?我澄清说,我也改变了持续时间。
from collections import OrderedDict
# add 'duration' var to dicts (makes code in loop clearer)
for dict_ in list_of_dicts:
try:
dict_.update({'duration': dict_['end'] - dict_['start']})
except KeyError:
dict_['duration'] = 999
# initialize result_dict with keys we'll add to
rolling_duration = 0
result_dict = OrderedDict([('text', ''), ('duration', 0)])
# looping directly through objects as mentioned in comments
for dict_ in list_of_dicts:
rolling_duration = rolling_duration + dict_['duration']
#print(dict_['word'], dict_['duration'], rolling_duration)
if dict_['case'] == 'success' and rolling_duration < 10:
result_dict['text'] = (result_dict['text'] + " " + dict_['word']).lstrip()
result_dict['duration'] = round(rolling_duration, 2)
# print accrued results and reset dict/rolling duration
else:
if result_dict['text'] != '':
print(json.dumps(result_dict))
result_dict = OrderedDict([('text', ''), ('duration', 0)])
rolling_duration = 0
# print final json result_dict after exiting loop
print(json.dumps(result_dict))
{"text": "Welcome to", "duration": 0.45}
{"text": "in a Bottle","duration": 0.44}
这是一个很好的开始谢谢你。当我的名单超过155项时,它给了我一个错误。它适用于我提供的样本集。 此外,我不认为我解释得很好,持续时间必须为整个文本块,小于10,如果文本块超过10我想在相同的条件下开始一个新的块。 – MathHeat44
'回溯(最近一次通话最后): 文件“/ Users/TracyShields/Scribie/Podcast-Data/new_align。PY” 22行,在
你的第二点是一个简单的修改,只需跟踪一个'rolling_duration'变量(不包括任何字典),并将其包含在'if'条件的条件中。 –
这可能是解决使用产生的需求最终字典发电机:
def split(it):
it = iter(it)
acc, duration = [], 0 # defaults
for item in it:
if item['case'] != 'success': # split when there's a non-success
if acc:
yield {'text': ' '.join(acc), 'duration': duration}
acc, duration = [], 0 # reset defaults
else:
tmp_duration = item['end'] - item['start']
if tmp_duration + duration >= 10: # split when the duration is too long
if acc:
yield {'text': ' '.join(acc), 'duration': duration}
acc, duration = [item['word']], tmp_duration # new defaults
else:
acc.append(item['word'])
duration += tmp_duration
if acc: # give the remaining items
yield {'text': ' '.join(acc), 'duration': duration}
一个简单的测试,得出:
>>> list(split(test))
[{'duration': 0.45000000000000007, 'text': 'Welcome to'},
{'duration': 0.44000000000000017, 'text': 'in a Bottle'}]
这样就可以很容易地甩到JSON文件:
>>> import json
>>> json.dumps(list(split(test)))
'[{"text": "Welcome to", "duration": 0.45000000000000007}, {"text": "in a Bottle", "duration": 0.44000000000000017}]'
如果你想要某人引导你完成某些事情,Stack Overflow不是寻找它的地方。指导你完成某些事情需要在这种格式中进行过多的来回交互;堆栈溢出更多的是“询问具体的,重点突出的问题,得到答案,交互结束”。 – user2357112
因此,请尝试执行上面的伪代码,并在遇到*特定*问题时回到我们这里。 – blacksite
欢迎来到SO。这是比大多数新用户发布更好的问题,所以不要感觉不好。我对如何编辑你的问题的建议:提供代码给出的输出,并提供你希望输出的内容。那么,既然你已经给了我们字典列表,人们可以尝试代码并确认他们已经得到你想要的输出。当我们获得您的数据和期望的上下文输出时,还需要更少的文本来解释您所需的逻辑。 –