在 Python 中提取每个子列表的第一个项目
- 2024-12-23 08:40:00
- admin 原创
- 53
问题描述:
我想知道提取列表列表中每个子列表的第一个项目并将其附加到新列表的最佳方法是什么。因此,如果我有:
lst = [[a,b,c], [1,2,3], [x,y,z]]
并且,我想提取出a
,1
并x
从中创建一个单独的列表。
我试过:
lst2.append(x[0] for x in lst)
解决方案 1:
使用列表理解:
>>> lst = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [item[0] for item in lst]
>>> lst2
['a', 1, 'x']
解决方案 2:
您可以使用 zip:
>>> lst=[[1,2,3],[11,12,13],[21,22,23]]
>>> zip(*lst)[0]
(1, 11, 21)
或者,Python 3 wherezip
不产生列表:
>>> list(zip(*lst))[0]
(1, 11, 21)
或者,
>>> next(zip(*lst))
(1, 11, 21)
或者,(我最喜欢的)使用 numpy:
>>> import numpy as np
>>> a=np.array([[1,2,3],[11,12,13],[21,22,23]])
>>> a
array([[ 1, 2, 3],
[11, 12, 13],
[21, 22, 23]])
>>> a[:,0]
array([ 1, 11, 21])
解决方案 3:
遇到了同样的问题并对每个解决方案的性能感到好奇。
以下是%timeit
:
import numpy as np
lst = [['a','b','c'], [1,2,3], ['x','y','z']]
第一个 numpy 方式,转换数组:
%timeit list(np.array(lst).T[0])
4.9 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
完全原生使用列表推导(正如@alecxe 所解释的):
%timeit [item[0] for item in lst]
379 ns ± 23.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
另一种本机使用方式zip
(由@dawg 解释):
%timeit list(zip(*lst))[0]
585 ns ± 7.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
第二种 numpy 方式。@dawg 也解释了这一点:
%timeit list(np.array(lst)[:,0])
4.95 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
令人惊讶的是(至少对我来说),使用列表推导的本机方法是最快的,比 numpy 方式快 10 倍左右。运行两种不使用最终方法的 numpy 方式list
可节省约 1 µs,但仍然有 10 倍的差异。
请注意,当我用对 的调用包围每个代码片段时len
,以确保生成器运行到最后,时间保持不变。
解决方案 4:
Python 包含一个名为 itemgetter 的函数,用于返回列表中特定索引处的项目:
from operator import itemgetter
将要检索的项目的索引传递给 itemgetter() 函数。要检索第一个项目,可以使用 itemgetter(0)。需要理解的重要一点是 itemgetter(0) 本身返回一个函数。如果将列表传递给该函数,则会获取特定项目:
itemgetter(0)([10, 20, 30]) # Returns 10
当你将它与 map() 结合使用时,它非常有用,map() 以函数作为其第一个参数,以列表(或任何其他可迭代对象)作为第二个参数。它返回对可迭代对象中的每个对象调用该函数的结果:
my_list = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']]
list(map(itemgetter(0), my_list)) # Returns ['a', 1, 'x']
请注意,map() 返回一个生成器,因此结果将传递给 list() 以获取实际列表。总之,您的任务可以像这样完成:
lst2.append(list(map(itemgetter(0), lst)))
这是使用列表推导的替代方法,选择哪种方法高度依赖于上下文、可读性和偏好。
更多信息:
https ://docs.python.org/3/library/operator.html#operator.itemgetter
解决方案 5:
您的代码几乎正确。唯一的问题是列表推导的使用。
如果你使用类似:(x[0] for x in lst),它会返回一个生成器对象。如果你使用类似:[x[0] for x in lst],它会返回一个列表。
当您将列表推导输出附加到列表时,列表推导的输出是列表的单个元素。
lst = [["a","b","c"], [1,2,3], ["x","y","z"]]
lst2 = []
lst2.append([x[0] for x in lst])
print lst2[0]
lst2 = [['a', 1, 'x']]
lst2[0] = ['a', 1, 'x']
如果我说错了,请告诉我。
解决方案 6:
lst = [['a','b','c'], [1,2,3], ['x','y','z']]
outputlist = []
for values in lst:
outputlist.append(values[0])
print(outputlist)
输出: ['a', 1, 'x']
解决方案 7:
您说您有一个现成的列表。所以我会按照这个列表去做。
>>> lst1 = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [1, 2, 3]
现在,您正在将生成器对象附加到第二个列表中。
>>> lst2.append(item[0] for item in lst)
>>> lst2
[1, 2, 3, <generator object <genexpr> at 0xb74b3554>]
但你可能希望它是第一项的列表
>>> lst2.append([item[0] for item in lst])
>>> lst2
[1, 2, 3, ['a', 1, 'x']]
现在我们将第一项列表附加到现有列表中。如果您想将项目本身(而不是项目列表)添加到现有列表中,则可以使用 list.extend。在这种情况下,我们不必担心添加生成器,因为 extend 将使用该生成器添加从那里获得的每个项目,以扩展当前列表。
>>> lst2.extend(item[0] for item in lst)
>>> lst2
[1, 2, 3, 'a', 1, 'x']
或者
>>> lst2 + [x[0] for x in lst]
[1, 2, 3, 'a', 1, 'x']
>>> lst2
[1, 2, 3]
https://docs.python.org/3.4/tutorial/datastructs.html#more-on-lists
https://docs.python.org/3.4/tutorial/datastructs.html#list-com经理
解决方案 8:
您可以将列表列表中的第一个值提取到新列表中,如下所示:
list_of_lists = [
['John', 'Anna'], [36, 24], ['Male', 'Female']
]
new_list = [list[0] for list in list_of_lists] # Here
print(new_list) # ['John', 36, 'Male']
或者:
list_of_lists = [
['John', 'Anna'], [36, 24], ['Male', 'Female']
]
new_list = [first for [first, second] in list_of_lists] # Here
print(new_list) # ['John', 36, 'Male']
解决方案 9:
我可以建议的另一个答案是
lst = [['a','b','c'], [1,2,3], ['x','y','z']]
new_lst=[lst[0][0],lst[1][0],lst[2][0]]
print(new_lst)
输出如下
['a',1,'x']
希望这能有所帮助!谢谢!
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件