(“ dezip”显然是一个不好的名字,但是我不确定正确的名字是什么。请原谅我,如果这意味着我由于不知道要搜索什么而错过了一个权威性的答案。)
假设我们有
people = [
(1, 'anne'),
(2, 'ben'),
(3, 'charlie'),
]
(在django中常见,供选择,等等。)
现在我们想要一个“键”列表或第一个元素列表:
[1, 2, 3]
在python 3我正在使用
people_ids, _ = list(zip(*people))
# or even
people_ids = [p[0] for p in people]
zip的方式似乎不太整洁,尤其是python 3将zip变成迭代器所需的额外
list(...)
。第二种理解方法更具可读性,但不能一概而论。在同一调用中返回第二,第三元素等的列表。
有没有更好的办法?
(其中“更好”主要表示清晰可读,但性能可能也有一定提高)
最佳答案
使用next
,您可以从迭代器中获取第一项:
>>> people = [
... (1, 'anne'),
... (2, 'ben'),
... (3, 'charlie'),
... ]
>>> next(zip(*people))
(1, 2, 3)
将
map
与operator.itemgetter
结合使用的替代方法:>>> import operator
>>> list(map(operator.itemgetter(0), people))
[1, 2, 3]
顺便说一句,没有
zip
的list
解决方案应该可以工作:>>> people_ids, _ = zip(*people)
>>> people_ids
(1, 2, 3)
关于python - 大多数pythonic3 dezip(?)实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36496439/