如何从列表理解的元组列表的单个列表中实现两个单独的列表列表?

时间:2015-11-02 17:25:16

标签: python list-comprehension

说,我有两个2D列表,如下所示:

[[('a', '1'), ('a', '12'), ('a', '3')], [('b', '21'), ('b', '31')], [ ('c', '11')]]

我想要实现的输出是:

Output_list=[['1','12','3'], ['21','31'], ['11']]

这里的主要复杂性是我希望通过单个list comprehension来实现输出。

我的一次尝试是:

print [a for innerList in fin_list1 for a,b in innerList]

输出:

['1', '12', '3', '21', '31', '11']

但是,正如您所看到的,虽然我已成功检索每个元组的第二个元素,但我无法保留内部列表结构。

3 个答案:

答案 0 :(得分:4)

我们从这开始:

>>> l = [[('a', '1'), ('a', '12'), ('a', '3')], [('b', '21'), ('b', '31')], [ ('c', '11')]]

最初你试图沿着这些方向做点什么:

>>> [y for sublist in l for x, y in sublist]
['1', '12', '3', '21', '31', '11']

这里的错误是这个列表理解是一维的,即所有的值都只是整数而不是列表本身

为了使这个二维,我们的值需要是列表。最简单的方法是让我们的值表达式成为嵌套列表解析,迭代原始列表的子列表元素:

>>> [[y for x, y in sublist] for sublist in l]
[['1', '12', '3'], ['21', '31'], ['11']]

从技术上讲,这是两个列表推导,但显然列表理解可以由map替换,如Roberto的回答中所述。

答案 1 :(得分:3)

首先,让我们分配数据:

>>> data = [
  [('a', '1'), ('a', '12'), ('a', '3')],
  [('b', '21'), ('b', '31')],
  [('c', '11')],
]

您可以使用itemgetter创建一个从元组中获取一个元素的函数:

>>> from operator import itemgetter
>>> first = itemgetter(0)
>>> second = itemgetter(1)

现在,您可以使用map

转换内部列表
>>> [map(first, row) for row in data]
[['a', 'a', 'a'], ['b', 'b'], ['c']]
>>> [map(second, row) for row in data]
[['1', '12', '3'], ['21', '31'], ['11']]

您还可以在不使用first的情况下创建seconditemgetter

def first(xs):
    return xs[0]

def second(xs):
    return xs[1]

答案 2 :(得分:1)

the_list = [[('a', '1'), ('a', '12'), ('a', '3')], [('b', '21'), ('b', '31')], [ ('c', '11')]]

new_list = [[x[1] for x in y] for y in the_list]

print new_list

输出:

  

[['1','12','3'],['21','31'],['11']]