如何将以下嵌套的dict列表解压缩到元组?

时间:2017-02-27 15:32:59

标签: python python-3.x data-structures tuples list-comprehension

我有一个非常大的嵌套列表,如下所示:

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)]

主要问题是我不知道如何管理}{字符。有人可以用理解列表解释哪种方法可以管理它们吗?

5 个答案:

答案 0 :(得分: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 :(得分:2)

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

答案 2 :(得分:1)

你的嵌套列表有一个"引用"问题在哪里。修复后,您可以使用列表解析从字典值重新创建元组:

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,否则您可以通过这样做(不一定是输入顺序)获得字典的自然内部顺序,这可能不是您想要的。

答案 3 :(得分: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]]

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

答案 4 :(得分:1)

您可以通过在每个字典中的值上调用tuple来获得所需内容:

@Html.TextBoxFor(model => model.DateOfDelivery, "{0:dd.MM.yyyy}")

如果您需要在密钥上对元组进行排序:

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