2017-04-14 107 views
2

假设这其中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

+1

如果你想要某人引导你完成某些事情,Stack Overflow不是寻找它的地方。指导你完成某些事情需要在这种格式中进行过多的来回交互;堆栈溢出更多的是“询问具体的,重点突出的问题,得到答案,交互结束”。 – user2357112

+0

因此,请尝试执行上面的伪代码,并在遇到*特定*问题时回到我们这里。 – blacksite

+0

欢迎来到SO。这是比大多数新用户发布更好的问题,所以不要感觉不好。我对如何编辑你的问题的建议:提供代码给出的输出,并提供你希望输出的内容。那么,既然你已经给了我们字典列表,人们可以尝试代码并确认他们已经得到你想要的输出。当我们获得您的数据和期望的上下文输出时,还需要更少的文本来解释您所需的逻辑。 –

回答

0

我在列表中的TE的中间增加了一个新的字典没有startend键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}

+0

这是一个很好的开始谢谢你。当我的名单超过155项时,它给了我一个错误。它适用于我提供的样本集。 此外,我不认为我解释得很好,持续时间必须为整个文本块,小于10,如果文本块超过10我想在相同的条件下开始一个新的块。 – MathHeat44

+0

'回溯(最近一次通话最后): 文件“/ Users/TracyShields/Scribie/Podcast-Data/new_align。PY” 22行,在 dict_.update({ '时间':字典_ [ '端'] - 字典_ [ '开始']}) KeyError异常:“end'' 我得到这个错误时,我的列表 – MathHeat44

+0

你的第二点是一个简单的修改,只需跟踪一个'rolling_duration'变量(不包括任何字典),并将其包含在'if'条件的条件中。 –

0

这可能是解决使用产生的需求最终字典发电机:

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