如何从具有列表理解的元组列表的单个列表中实现两个单独的列表列表?
How to achieve two separate list of lists from a single list of lists of tuple with 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']
但是,如您所见,虽然我已成功检索每个元组的第二个元素,但未能保留我的内部列表结构。
我们从这里开始:
>>> 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']
这里的错误是这个列表理解是一维的,即所有的值都只是整数而不是列表本身
为了使它成为二维的,我们的值需要是列表。最简单的方法是让我们的值表达式成为一个 nested 列表理解,它迭代原始列表的子列表的元素:
>>> [[y for x, y in sublist] for sublist in l]
[['1', '12', '3'], ['21', '31'], ['11']]
从技术上讲,这是两个列表推导式,但显然可以用 map
替换列表推导式,如 Roberto 的回答中所述。
首先,让我们分配数据:
>>> 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']]
您也可以在不使用 itemgetter
的情况下创建 first
和 second
:
def first(xs):
return xs[0]
def second(xs):
return xs[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']]
说,我有一个如下所示的两个 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']
但是,如您所见,虽然我已成功检索每个元组的第二个元素,但未能保留我的内部列表结构。
我们从这里开始:
>>> 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']
这里的错误是这个列表理解是一维的,即所有的值都只是整数而不是列表本身
为了使它成为二维的,我们的值需要是列表。最简单的方法是让我们的值表达式成为一个 nested 列表理解,它迭代原始列表的子列表的元素:
>>> [[y for x, y in sublist] for sublist in l]
[['1', '12', '3'], ['21', '31'], ['11']]
从技术上讲,这是两个列表推导式,但显然可以用 map
替换列表推导式,如 Roberto 的回答中所述。
首先,让我们分配数据:
>>> 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']]
您也可以在不使用 itemgetter
的情况下创建 first
和 second
:
def first(xs):
return xs[0]
def second(xs):
return xs[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']]