2

我是新来的python,我想做一个字典使用元组作为键和嵌套列表作为多个值。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..} 

会很感激任何指针......谢谢!

回答

7

您可以使用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']} 
+1

我刚刚复制我的答案,并切换到浏览器,我看到你的答案。 aaaahh – thefourtheye

+0

太棒了,非常感谢! –

1

使用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代替新的 长度值。


这是非常有趣的。

+0

不错,非常感谢你! –

+0

@jO没问题。 hcwhsa的答案远远优越,但这只是一个有趣的问题。快乐编码:D – RMcG

1

下面是使用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']} 
>>> 

希望这有助于!

+0

干杯!很高兴看到几个很好的解决方案来完成一项任务! –

相关问题