【问题标题】:Python: Making a dict from tuple keys with multiple values from a nested listPython:从嵌套列表中具有多个值的元组键制作字典
【发布时间】:2013-11-09 15:46:38
【问题描述】:

我是 python 新手,我正在尝试使用元组作为键和嵌套列表作为多个值来制作字典。

列表嵌套在三元组中; [[[Isolation source],[host],[country]]...etc]

下面的例子:

value_list = [[['NaN'], ['sponge'], ['Palau']], [['skin'], ['fish'], ['Cuba']], [['claw'], ['crab'], ['Japan: Aomori, Natsudomari peninsula']]....]

还有键的元组;

key_tuple = ('AB479448', 'AB479449', 'AB602436',...)

因此,我希望输出看起来像这样;

dict = {'AB479448': [NaN, sponge, Palau], 'AB479449': [skin, fish, Cuba], 'AB602436': [claw, crab, Japan: Aomori, Natsudomari peninsula]

我尝试了一些不同的解决方案,但我无法完成工作......例如字典理解;

dict = { i: value_list for i in key_tuple }

上面给了我这个(使用不同的键,但将相同的值关联到每个键);

{'AB479448': [[[NaN, sponge, Palau]]], 'AB479449': [[[NaN, sponge, Palau]]], 'AB602436': [[[NaN, sponge, Palau]]]...etc..}

不胜感激任何指针...谢谢!

【问题讨论】:

    标签: python dictionary tuples nested-lists dictionary-comprehension


    【解决方案1】:

    您可以使用itertools.chain.from_iterableitertools.izip(或zip)和字典理解:

    >>> from itertools import chain, izip
    >>> value_list = [[['NaN'], ['sponge'], ['Palau']], [['skin'], ['fish'], ['Cuba']], [['claw'], ['crab'], ['Japan: Aomori, Natsudomari peninsula']]]
    >>> key_tuple = ('AB479448', 'AB479449', 'AB602436')
    >>> {k: list(chain.from_iterable(v)) for k, v in izip(key_tuple, value_list)}
    {'AB479449': ['skin', 'fish', 'Cuba'],
     'AB479448': ['NaN', 'sponge', 'Palau'],
     'AB602436': ['claw', 'crab', 'Japan: Aomori, Natsudomari peninsula']}
    

    【讨论】:

    • 我刚刚复制了我的答案并切换到浏览器,我看到了你的答案。啊啊
    【解决方案2】:

    使用zipiter,您可以创建所需的输出字典,如下所示

    value_list = [[['NaN'], ['sponge'], ['Palau']], [['skin'], ['fish'], ['Cuba']], [['claw'], ['crab'], ['Japan: Aomori, Natsudomari peninsula']]]
    key_tuple = ('AB479448', 'AB479449', 'AB602436')
    
    dict( (key,[[list(value)]]) for key,value in zip(key_tuple, zip(*(iter(t[0] for v in value_list for t in v),)*3)))
    
    Out[16]: {'AB479448': [[['NaN', 'sponge', 'Palau']]], 'AB479449': [[['skin', 'fish', 'Cuba']]],'AB602436': [[['claw', 'crab', 'Japan: Aomori, Natsudomari peninsula']]]}
    

    如果列表键中所需的元素数量发生变化,您可以将 3 替换为新的 长度值。


    制作这个真的很有趣。

    【讨论】:

    • @jO 没问题。 hcwhsa 的回答要好得多,但这只是一个有趣的问题。快乐编码:D
    【解决方案3】:

    这是使用itertools.chain.from_iterable 和字典理解的解决方案:

    from itertools import chain
    {keys[i]:list(chain.from_iterable(contents)) for i, contents in enumerate(my_list)}
    

    这,等于:

    from itertools import chain
    for i, contents in enumerate(my_list): #get [['skin'], ['fish'], ['Cuba']]
        result[keys[i]] = list(chain.from_iterable(contents))
    

    演示

    >>> from itertools import chain
    >>> my_list = [[['NaN'], ['sponge'], ['Palau']], [['skin'], ['fish'], ['Cuba']], [['claw'], ['crab'], ['Japan: Aomori, Natsudomari peninsula']]]
    >>> keys = ('AB479448', 'AB479449', 'AB602436')
    >>> {keys[i]:list(chain.from_iterable(contents)) for i, contents in enumerate(my_list)}
    {'AB479449': ['skin', 'fish', 'Cuba'], 'AB479448': ['NaN', 'sponge', 'Palau'], 'AB602436': ['claw', 'crab', 'Japan: Aomori, Natsudomari peninsula']}
    >>> 
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多