我试图过滤以下列表:
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,它会找到列表中所有第二个浮点数的最大值。所以我假设我接近解决方案?
答案 0 :(得分:1)
您可以使用list comprehension。
x = [[el[1]] for el in filtered]
或:
x = [[y] for x,y in filtered]
您还可以将map
与itemgetter
一起使用。要打印它,请迭代iterable返回的map
对象。例如,您可以使用list
。
from operator import itemgetter
x = map(itemgetter(1), filtered)
print(list(x))
答案 1 :(得分:0)
您并未尝试将key
传递给map
的解决方案。 map
只接受一个函数和一个可迭代(或多个迭代)。关键功能用于与订购相关的功能(sorted
,max
等。)
但是你在开始时实际上非常接近解决方案:
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)