(“ 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)


mapoperator.itemgetter结合使用的替代方法:

>>> import operator
>>> list(map(operator.itemgetter(0), people))
[1, 2, 3]




顺便说一句,没有ziplist解决方案应该可以工作:

>>> people_ids, _ = zip(*people)
>>> people_ids
(1, 2, 3)

关于python - 大多数pythonic3 dezip(?)实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36496439/

10-12 17:02