过滤列表中的列表以获取所有第二个数字

时间:2018-05-13 21:09:40

标签: python python-3.x

我试图过滤以下列表:

filtered = [[1.0, 3.0], [2.0, 70.0], [40.0, 3.0], [5.0, 50.0], [6.0, 5.0], [7.0, 21.0]]

要获取列表中列表中的每一个数字,请执行以下操作:

filtered = [[3.0], [70.0], [3.0], [50.0], [5.0], [21.0]]

我尝试了以下不起作用:

from operator import itemgetter
a = map(itemgetter(0), filtered)
print(a)

以下也不起作用:

from operator import itemgetter
b = map(filtered,key=itemgetter(1))[1]
print(b)

在我已经显示的最后一行代码中,如果我将map更改为max,它会找到列表中所有第二个浮点数的最大值。所以我假设我接近解决方案?

2 个答案:

答案 0 :(得分:1)

您可以使用list comprehension

x = [[el[1]] for el in filtered]

或:

x = [[y] for x,y in filtered]

您还可以将mapitemgetter一起使用。要打印它,请迭代iterable返回的map对象。例如,您可以使用list

from operator import itemgetter
x = map(itemgetter(1), filtered)
print(list(x))

答案 1 :(得分:0)

您并未尝试将key传递给map的解决方案。 map只接受一个函数和一个可迭代(或多个迭代)。关键功能用于与订购相关的功能(sortedmax等。)

但是你在开始时实际上非常接近解决方案:

a = map(itemgetter(0), filtered)

第一个问题是你想要第二个项目(第1项),但是你将0传递给itemgetter而不是1。这显然不会奏效。

第二个问题是a是一个map对象 - 一个懒惰的可迭代对象。它确实拥有你想要的信息:

>>> a = map(itemgetter(1), filtered)
>>> for val in a: print(val, sep=' ')
3.0 70.0 3.0 50.0 5.0 21.0

...但不是列表。如果您需要列表,则必须在其上调用list

>>> a = list(map(itemgetter(1), filtered))
>>> print(a)
[3.0, 70.0, 3.0, 50.0, 5.0, 21.0]

最后,您需要一个单元素列表列表,而不是元素列表。换句话说,您希望等效于item[1:][item[1]],而不仅仅是item[1]。您可以使用itemgetter执行此操作,但它非常难看,因为您无法直接使用[1:]之类的切片语法,您必须手动构建切片对象:

>>> a = list(map(itemgetter(slice(1, None)), filtered))
>>> print(a)
[[3.0], [70.0], [3.0], [50.0], [5.0], [21.0]]

使用lambda函数可以更好地编写这个函数:

>>> a = list(map(lambda item: item[1:], filtered))
>>> print(a)
[[3.0], [70.0], [3.0], [50.0], [5.0], [21.0]]

但是在这一点上,值得退后一步:map与生成器表达式做同样的事情,但map接受一个函数,而genexpr接受一个表达式。我们已经确切地知道我们想要的表达方式;困难的部分是把它变成一个功能:

>>> a = list(item[1:] for item in filtered)
>>> print(a)

另外,您不需要额外的步骤将其转换为带有genexpr的列表;只需用括号替换括号,您就可以获得列表理解:

>>> a = [item[1:] for item in filtered]
>>> print(a)