【问题标题】:Extracting (interval) values from multiple dictionaries inside one large list, and combining these with corresponding lists inside another large list从一个大列表中的多个字典中提取(间隔)值,并将这些值与另一个大列表中的相应列表组合
【发布时间】:2016-01-15 14:24:55
【问题描述】:

我有两个大列表。

第一个是w_list;一个包含 (1) 单词(例如 'right')、(2) 开始 id/标签(例如 '#TWsp10')和 (3) 结束 id/标签(例如 '#TWep10')的大列表. (这些话来自两个说话者之间的对话)。 w_list 开始:

w_list = [['right', '#TWSp10', '#TWEp10'], ['_', '#TWSp11', '#TWEp11'], ['cough', '#TWSp12', '#TWEp12'], ['_', '#TWSp13', '#TWEp13'], ['go', '#TWSp14', '#TWEp14'], [...] , [...]]

第二个列表 (t_list) 是一个很大的字典列表。字典由 (1) 'xml:id' 键和相应的 id/tag 值组成(例如 'TWsp10'、'TWep10'),这些值类似于 w_list 中的开始和结束 id/tags,这意味着 t_list 中的字典数是w_list 中列表数量的两倍),(2)'interval'键,其值表示单词在对话中出现的时间,以及(3)不相关的'since'键。 t_list 的开始:

t_list = [{'interval': '0', 'xml:id': 'TWSp10', 'since': '#TW0'}, {'interval': '0.2108', 'xml:id': 'TWEp10', 'since': '#TW0'}, {'interval': '0.2108', 'xml:id': 'TWSp11', 'since': '#TW0'}, {'interval': '0.7049', 'xml:id': 'TWEp11', 'since': '#TW0'}, {'interval': '0.7049', 'xml:id': 'TWSp12', 'since': '#TW0'}, {'interval': '0.9223', 'xml:id': 'TWEp12', 'since': '#TW0'}, {'interval': '0.9223', 'xml:id': 'TWSp13', 'since': '#TW0'}, {'interval': '1.6568', 'xml:id': 'TWEp13', 'since': '#TW0'}, {'interval': '1.6568', 'xml:id': 'TWSp14', 'since': '#TW0'}, {'interval': '1.7886', 'xml:id': 'TWEp14', 'since': '#TW0'}, {...} , {...}]

这是我想要创建的示例输出,是否有任何提示可以让我走上正确的道路/轨道?:

word: 'right' start: 0       end: 0.2108 
word: '_'     start: 0.2108  end: 0.1049
word: 'cough' start: 0.7049  end: 0.9223
''
''

与以下内容“相似”:

'right' '#TWsp10': 0       '#TWsp10': 0.2108 
'_'     '#TWsp11': 0.2108  '#TWep11': 0.1049
'cough' '#TWsp12': 0.7049  '#TWep12: 0.9223
''
''

用冒号创建单词、开始和结束字符串绝对不是问题。 这是如何从 dicts(在 t_list 中)提取区间值,并将它们与列表(在 w_list 中)各自的结束/开始 id/标签结合起来。

感谢任何建议。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    首先创建一个时间间隔字典,以标签为键

    time_dict = {i['xml:id'] : i['interval'] for i in t_list}

    time_dict = 
    {'TWEp10': '0.2108',
     'TWEp11': '0.7049',
     'TWEp12': '0.9223',
     'TWEp13': '1.6568',
     'TWEp14': '1.7886',
     'TWSp10': '0',
     'TWSp11': '0.2108',
     'TWSp12': '0.7049',
     'TWSp13': '0.9223',
     'TWSp14': '1.6568'}
    

    然后简单地遍历单词列表并检索时间

    from collections import defaultdict
    res = defaultdict(list)
    for word, start, end in w_list:
        res[word].append({'start':time_dict[start[1:]], 'end': time_dict[end[1:]] }) 
    

    [1:] 删除字符串中的#

    结果:

    res = 
        {
        "go": [
            {
                "start": "1.6568", 
                "end": "1.7886"
            }
        ], 
        "cough": [
            {
                "start": "0.7049", 
                "end": "0.9223"
            }
        ], 
        "right": [
            {
                "start": "0", 
                "end": "0.2108"
            }
        ], 
        "_": [
            {
                "start": "0.2108", 
                "end": "0.7049"
            }, 
            {
                "start": "0.9223", 
                "end": "1.6568"
            }
        ]
    }
    

    编辑:

    time_dict创建结果的替代方法

    from operator import itemgetter
    wlist2 = [(word, float(time_dict[start[1:]]), float(time_dict[end[1:]])) for word, start, end in w_list]
    wlist2.sort(key = itemgetter(1))
    

    此列表中的前十个元素:

    ('right', 0.0, 0.2108)
    ('_', 0.0, 1.0106)
    ('_', 0.2108, 0.7049)
    ('cough', 0.7049, 0.9223)
    ('_', 0.9223, 1.6568)
    ('nonvocal', 1.0106, 1.0688)
    ('_', 1.0688, 2.2074)
    ('go', 1.6568, 1.7886)
    ('south', 1.7886, 2.229)
    ('nonvocal', 2.2074, 2.4019)
    

    【讨论】:

    • @K.Wine 某些词是否多次出现?由于 dict 使用单词作为键,任何重复的单词都会丢失。但是如果是这种情况, res 可以转换为列表
    • 实际上“-”在您的示例数据中出现了两次。所以我现在稍微改变了脚本。您能否添加完整数据的粘贴箱,或者尝试创建一个新的最小示例来解决问题?
    • 我找不到任何缺少的单词,您知道缺少任何特定的单词吗?您是否再次检查了我上次所做的更新?
    • nbviewer.ipython.org/gist/anonymous/6cbbcefd49990b007d71 看看这个我是如何测试它的
    • 看我上次的编辑,它可能对你更好,这取决于它的用途。将其打印在格式精美的表格中,我留给您自己弄清楚:)
    【解决方案2】:

    您可以执行以下操作:

    >>> w_list = [['right', '#TWSp10', '#TWEp10'], ['_', '#TWSp11', '#TWEp11'], ['cough', '#TWSp12', '#TWEp12'], ['_', '#TWSp13', '#TWEp13'], ['go', '#TWSp14', '#TWEp14']]
    >>> 
    >>> t_list = [{'interval': '0', 'xml:id': 'TWSp10', 'since': '#TW0'}, {'interval': '0.2108', 'xml:id': 'TWEp10', 'since': '#TW0'}, {'interval': '0.2108', 'xml:id': 'TWSp11', 'since': '#TW0'}, {'interval': '0.7049', 'xml:id': 'TWEp11', 'since': '#TW0'}, {'interval': '0.7049', 'xml:id': 'TWSp12', 'since': '#TW0'}, {'interval': '0.9223', 'xml:id': 'TWEp12', 'since': '#TW0'}, {'interval': '0.9223', 'xml:id': 'TWSp13', 'since': '#TW0'}, {'interval': '1.6568', 'xml:id': 'TWEp13', 'since': '#TW0'}, {'interval': '1.6568', 'xml:id': 'TWSp14', 'since': '#TW0'}, {'interval': '1.7886', 'xml:id': 'TWEp14', 'since': '#TW0'}]
    >>>
    >>> for t1 , (t2,t3) in zip(w_list, zip(t_list[::2],t_list[1::2])):
        print 'word: {0[0]:<10} start: {1[interval]:<10} end: {2[interval]:<10}'.format(t1, t2, t3) #for pretty printing 
    
    
    word: right      start: 0          end: 0.2108    
    word: _          start: 0.2108     end: 0.7049    
    word: cough      start: 0.7049     end: 0.9223    
    word: _          start: 0.9223     end: 1.6568    
    word: go         start: 1.6568     end: 1.7886  
    >>>
    >>> d = {} #save the needed data as a dictionary
    >>> for t1 , (t2,t3) in zip(w_list, zip(t_list[::2],t_list[1::2])):
        d[t1[0]] = {'start':t2['interval'], 'end':t3['interval']}
    {'go': {'start': '1.6568', 'end': '1.7886'}, 'cough': {'start': '0.7049', 'end': '0.9223'}, 'right': {'start': '0', 'end': '0.2108'}, '_': {'start': '0.9223', 'end': '1.6568'}}
    

    编辑:

    前一种方法的问题是,如果您不确定两个列表的排序是否相同,为了摆脱这种情况,请将两个列表排序为相同的顺序:

    >>> import re
    >>> from operator import itemgetter
    >>>
    >>> t_sorted = sorted(t_list, key=lambda s:re.findall(r'\d+$',s['xml:id']))
    >>> t_sorted = sorted(t_list, key=lambda s:s['xml:id'][-2:]) #if you are sure that the last two are always digits, but I don't recommend it for general cases
    >>> t_sorted
    [{'xml:id': 'TWSp10', 'interval': '0', 'since': '#TW0'}, {'xml:id': 'TWEp10', 'interval': '0.2108', 'since': '#TW0'}, {'xml:id': 'TWSp11', 'interval': '0.2108', 'since': '#TW0'}, {'xml:id': 'TWEp11', 'interval': '0.7049', 'since': '#TW0'}, {'xml:id': 'TWSp12', 'interval': '0.7049', 'since': '#TW0'}, {'xml:id': 'TWEp12', 'interval': '0.9223', 'since': '#TW0'}, {'xml:id': 'TWSp13', 'interval': '0.9223', 'since': '#TW0'}, {'xml:id': 'TWEp13', 'interval': '1.6568', 'since': '#TW0'}, {'xml:id': 'TWSp14', 'interval': '1.6568', 'since': '#TW0'}, {'xml:id': 'TWEp14', 'interval': '1.7886', 'since': '#TW0'}]
    >>>
    >>> w_sorted = sorted(w_list, key=itemgetter(1))
    >>> w_sorted
    [['right', '#TWSp10', '#TWEp10'], ['_', '#TWSp11', '#TWEp11'], ['cough', '#TWSp12', '#TWEp12'], ['_', '#TWSp13', '#TWEp13'], ['go', '#TWSp14', '#TWEp14']]
    >>> d = {} #save the needed data as a dictionary
    >>> for t1 , (t2,t3) in zip(w_sorted, zip(t_sorted[::2],t_sorted[1::2])):
        d[t1[0]] = {'start':t2['interval'], 'end':t3['interval']}
    

    【讨论】:

    • 如果这两个列表始终正确排序,这将比我的答案更好。
    • @M4rtini...是的..我要更新我的答案,首先以相同的顺序对两个列表进行排序
    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2015-03-27
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多