2

我有一个非常大的嵌套列表像这样的:如何将dict的下列嵌套列表解压缩为元组?

a_lis = [[{'A': 'the', 'B': 'US3---'}, {'A': 'the', 'B': 'PS3N'}, {'A': 'the', 'B': 'P3N'}, {'A': 'quick', 'B': 'GS'}, {'A': 'quick', 'B': 'NCMSN-'}, {'A': 'fox', 'B': 'YN-'}, {'A': 'it', 'B': 'VI--2PSA--N-'}, {'A': 'jumping', 'B': 'GNM-'}]] 

怎样才能把它改造成?:

[('the', 'US3---'), ('the', 'PS3N'), ('the', 'P3N'), ('quick', 'GS'), ('quick', 'NCMSN-'), ('fox', 'YN-'), ('it's, 'VI--2PSA--N-'), ('jumping', 'GNM-')] 

我想:

tuples = ['{}'.join(x) for x in a_list[0]] 

和:

values = [','.join(str(v) for v in a_list)] 

主要问题是我没有如何管理}{字符。有人可以解释哪一个是理解列表的最佳方式吗?

+2

是第二在原始结构中列出错字还是实际上是这样吗?你有多少内部列表? –

+0

@ Elmex80s我修正了这个问题。 –

+0

其实就是这样。这就是我使用'[0]'的原因。只有一个列表,感谢您的帮助! @ Ev.Kounis –

回答

4

固定在你的输入线串的语法错误,你可以在正确的维持秩序的东西,如

>>> list(map(lambda d: (d['A'], d['B']), a_lis[0])) 

[('the', 'US3---'), 
('the', 'PS3N'), 
('the', 'P3N'), 
('quick', 'GS'), 
('quick', 'NCMSN-'), 
('fox', 'YN-'), 
("it's", 'VI--2PSA--N-'), 
('jumping', 'GNM-')] 

或等同与列表理解

>>> [(d['A'], d['B']) for d in a_lis[0]] 

[('the', 'US3---'), 
('the', 'PS3N'), 
('the', 'P3N'), 
('quick', 'GS'), 
('quick', 'NCMSN-'), 
('fox', 'YN-'), 
("it's", 'VI--2PSA--N-'), 
('jumping', 'GNM-')] 

如果a_lis有除了你想要在元组列表中的第一个索引之外的项目,你可以解压。

list(map(lambda d: (d['A'], d['B']), *a_lis)) 
1

你的嵌套列表在某处有一个“quote”问题。一旦固定就可以使用列表理解重新从字典中值的元组:

a_lis = [[{'A': 'the', 'B': 'US3---'}, {'A': 'the', 'B': 'PS3N'}, {'A': 'the', 'B': 'P3N'}, {'A': 'quick', 'B': 'GS'}, {'A': 'quick', 'B': 'NCMSN-'}, {'A': 'fox', 'B': 'YN-'}, {'A': "it's", 'B': 'VI--2PSA--N-'}, {'A': 'jumping', 'B': 'GNM-'}]] 

n = [tuple(a.values()) for a in a_lis[0]] 

print(n) 

你:

[('US3---', 'the'), ('PS3N', 'the'), ('P3N', 'the'), ('GS', 'quick'), ('NCMSN-', 'quick'), ('YN-', 'fox'), ('VI--2PSA--N-', "it's"), ('GNM-', 'jumping')] 

正如有人指出的,除非你使用Python 3.6,你会得到自然的内部通过这样做(不一定是输入顺序)字典的顺序,这可能不是你想要的。

+0

字典没有订单。那么什么保证价值将按正确的顺序? – Elmex80s

+0

没有什么能保证它,实际上,你是对的。 –

+0

排序?没有,这不会不幸。 – Elmex80s

1

链名单,并把它们提供给tuple

from itertools import chain 

tps = [tuple(i.values()) for i in chain.from_iterable(a_lis)] 

变量tps现在(随机)成立:

[('the', 'US3---'), 
('the', 'PS3N'), 
('the', 'P3N'), 
('quick', 'GS'), 
('quick', 'NCMSN-'), 
('fox', 'YN-'), 
('its', 'VI--2PSA--N-'), 
('jumping', 'GNM-')] 

如果您需要确定性处理应先变换元组的创建所有嵌套字典转化为有序字典:

from collections import OrderedDict 

a_lis = [OrderedDict(d) for d in a_lis[0]] 

,然后像以前一样执行字典转换。

+1

我没有downvote。但是,在这里你得到正确的排序并不只是巧合,其他字典不一定能够提供预期的输出结果? – roganjosh

+1

这是一个巧合(python 3.6除外)(我也没有downvote,我可能有谁的想法:)) –

+1

是的,它是@roganjosh我完全忘记了现在:-)。 –

2
[tuple(j.values()) for i in a_lis for j in i] 
1

你可以得到你想要的东西在每个字典呼吁值tuple

nested = a_lis[0] 
value_tuples = [tuple(dictionary.values()) for dictionary in nested] 

如果需要的元组进行重点排序:

nested = a_lis[0] 
value_tuples = [tuple(dictionary[k] for k in sorted(dictionary)) for dictionary in nested] 
相关问题