【问题标题】:How to make an index combining values of lists nested in tuples?如何创建一个组合嵌套在元组中的列表值的索引?
【发布时间】:2017-08-18 05:28:25
【问题描述】:

我很难实现我需要实现的目标,所以我想知道这里是否有人可以帮助我:-)

我看过示例 11.4。 (列出成员资格)在http://openbookproject.net/thinkcs/python/english3e/lists.html 上,这在某些方面非常接近我的目标。

项目是:

  • 从引用 (key, [list of values]) 的元组列表开始

    my_list = [('a',[0]), ('b',[1]), ('c',[2]), ('a',[3])]
    
  • 我想扫描“my_list”以附加嵌套列表,将 值列表组合为仅一个 ,如下所示:

    my_list = [('a',[0, 3]), ('b',[1]), ('c',[2])]
    
  • 我成功地手动组合了值,但我想自动化它,但我找不到如何去做! ^^

  • 现在,这是我所拥有的:

    # my_input == 'a b c a'
    
    #splitting input to list
    >>> raw_list = my_input.split()
    >>> raw_list
    ['a', 'b', 'c', 'a']
    
    #getting an enumeration for each entry
    #### (in order of appearance, this is important!) ####
    >>> enum_list = [(b,[a]) for a, b in enumerate(raw_list)]
    >>> enum_list
    [('a', [0]), ('b', [1]), ('c', [2]), ('a', [3])]
    
    #trying to append the enum value of the second 'a' to the first tuple of 'a'
    >>> for (x, y) in enum_list :
    ...     for (x, z) in enum_list :
    ...             enum_list[enum_list.index((x, z))][1].append(y)
    ... 
    >>> enum_list
    [('a', [0, [...], [1, [...], [...], [2, [...], [...], [...], [3, [...], [...], [...], [...]]], [3, [...], [...], [2, [...], [...], [...], [...]], [...]]], [2, [...], [1, [...], [...], [...], [3, [...], [...], [...], [...]]], [...], [3, [...], [1, [...], [...], [...], [...]], [...], [...]]], [3, [...], [1, [...], [...], [2, [...], [...], [...], [...]], [...]], [2, [...], [1, [...], [...], [...], [...]], [...], [...]], [...]]]), ('b', [1, [0, [...], [...], [2, [...], [...], [...], [3, [...], [...], [...], [...]]], [3, [...], [...], [2, [...], [...], [...], [...]], [...]]], [...], [2, [0, [...], [...], [...], [3, [...], [...], [...], [...]]], [...], [...], [3, [0, [...], [...], [...], [...]], [...], [...], [...]]], [3, [0, [...], [...], [2, [...], [...], [...], [...]], [...]], [...], [2, [0, [...], [...], [...], [...]], [...], [...], [...]], [...]]]), ('c', [2, [0, [...], [1, [...], [...], [...], [3, [...], [...], [...], [...]]], [...], [3, [...], [1, [...], [...], [...], [...]], [...], [...]]], [1, [0, [...], [...], [...], [3, [...], [...], [...], [...]]], [...], [...], [3, [0, [...], [...], [...], [...]], [...], [...], [...]]], [...], [3, [0, [...], [1, [...], [...], [...], [...]], [...], [...]], [1, [0, [...], [...], [...], [...]], [...], [...], [...]], [...], [...]]]), ('a', [3, [0, [...], [1, [...], [...], [2, [...], [...], [...], [...]], [...]], [2, [...], [1, [...], [...], [...], [...]], [...], [...]], [...]], [1, [0, [...], [...], [2, [...], [...], [...], [...]], [...]], [...], [2, [0, [...], [...], [...], [...]], [...], [...], [...]], [...]], [2, [0, [...], [1, [...], [...], [...], [...]], [...], [...]], [1, [0, [...], [...], [...], [...]], [...], [...], [...]], [...], [...]], [...]])]
    
  • 很抱歉这行太长了,但我认为它会更符合整个错误...

如果我不够清楚,请不要犹豫,告诉我,我会提供更多详细信息。

感谢您的时间和解释 :-)

【问题讨论】:

    标签: python list indexing tuples


    【解决方案1】:

    使用OrderedDict(首先是import collections)看起来很简单:

    In [438]: dict_ = collections.OrderedDict()
    
    In [439]: for l in my_list:
         ...:     dict_.setdefault(l[0], []).extend(l[1])
         ...:     
    
    In [440]: dict_
    Out[440]: OrderedDict([('a', [0, 3]), ('b', [1]), ('c', [2])])
    

    现在,如果您想恢复元组,只需遍历字典即可:

    In [441]: [(k, v) for k, v in dict_.items()]
    Out[441]: [('a', [0, 3]), ('b', [1]), ('c', [2])]
    

    【讨论】:

    • 是的,使用字典是解决这个问题的最佳方法。
    【解决方案2】:

    您可以使用defaultdict 容器创建列表字典,然后只存储每个元组对的值。请注意,我使用 ('d', [4, 5]) 项扩展了您的原始列表,以说明此方法也适用于任意长度的列表。

    from collections import defaultdict
    
    my_list = [('a', [0]), ('b', [1]), ('c', [2]), ('a', [3]), ('d', [4, 5])]
    
    dd = defaultdict(list)
    for pair in my_list:
        k, v = pair
        dd[k].extend(v)  
    >>> dd.items()
    [('a', [0, 3]), ('c', [2]), ('b', [1]), ('d', [4, 5])]
    

    【讨论】:

    • 这里的订单受到影响。实际上,在 setdefault 面前,一个 defaultdict 是矫枉过正的。
    • 嗯,不是明确的,但是使用列表和元组会表明其他情况......无论如何,这在 OP 上。
    • 看起来不错,但由于某种原因它对我不起作用:python 在 dd[k].extend(v[0]) >>>>>: Traceback (最近一次调用最后):文件“”,第 3 行,在 TypeError:'int' object is not iterable
    • @EtienneS 应该是dd[k].extend(v) 而不是dd[k].extend(v[0])。请注意,如果每个元组对的列表中只有一个数字,dd[k].append(v[0]) 将起作用。
    【解决方案3】:

    你可以使用字典来构造列表

    my_list = [('a',[0]), ('b',[1]), ('c',[2]), ('a',[3])]
    my_dict = {}
    
    for item in my_list:
        if item[0] in my_dict.keys():
            ### if key exists append to list
            my_dict[item[0]].extend(item[1][0:])
        else:
            ### if key does not exist create new key-value pair
            my_dict[item[0]] = [item[1][0]]
    
    my_list = my_dict.items()
    print my_list
    

    【讨论】:

    • 如果列表包含多个元素,您将丢失数据。我推荐extend
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2020-02-16
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多