说,我有两个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']
但是,正如您所看到的,虽然我已成功检索每个元组的第二个元素,但我无法保留内部列表结构。
答案 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
的情况下创建second
和itemgetter
:
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']]