17

我有一个元组的元组,我想将每个元组中的第一个值放入一个集合中。我认为使用 map() 将是这样做的好方法,唯一的事情是我找不到访问元组中第一个元素的简单方法。例如,我有 tuple ((1,), (3,))。我想做类似set(map([0], ((1,), (3,))))[0]访问第零个元素的地方)来获得一个包含 1 和 3 的集合。我能想到的唯一方法是定义一个函数:def first(t): return t[0]. 无论如何,无需声明函数就可以在一行中执行此操作吗?

4

8 回答 8

20

使用列表推导:

data = ((1,), (3,))
print([x[0] for x in data])
于 2011-05-13T23:49:09.003 回答
18

使用operator.itemgetter

from operator import itemgetter
map(itemgetter(0), ((1,), (3,)))

虽然列表推导通常更具可读性,但itemgetter最接近您的要求。它也有点快:

>>> from timeit import timeit
>>> setup = 'from operator import itemgetter; lst=( ("a",), ("b",), (1,), (2,))'
>>> timeit('map(itemgetter(0), lst)', setup=setup)
0.13061050399846863
>>> timeit('[i[0] for i in lst]', setup=setup)
0.20302422800159547
于 2011-05-13T23:57:10.900 回答
4
my_set = {x[0] for x in TUPLES}
于 2011-05-13T23:51:43.573 回答
3

获得它的另一种方式:

set(x for x, in data)
于 2011-05-13T23:58:04.337 回答
2

Python 支持使用lambda关键字创建匿名函数。这允许您使用函数而无需正式定义它。鉴于您的示例,您将像这样使用 lambda:

data = ((1,), (3,))
set(map(lambda x: x[0], data))

这相当于:

def f(x):
    return x[0]

set(map(f, data))

但正如其他人所说,列表推导比使用 map 更受欢迎。

于 2011-05-13T23:51:21.223 回答
2

您可以在 Python 2.7 和 3.x 中使用集合推导:

>>> t = ((1,), (3,))
>>> s = {x[0] for x in t}
>>> s
set([1, 3])

或在 Python < 2.7 中:

>>> s = set([x[0] for x in t])
>>> s
set([1, 3])
于 2011-05-13T23:52:25.483 回答
2
data = ((1,), (3,))
s = set(zip(*data)[0])

If there are more items in your tuples you might save some memory and time using izip and islice.

于 2011-05-14T00:00:49.267 回答
1

和@Winston 一起去吧。列表理解很棒。如果您真的想使用 map,请使用前面建议的 lambda,或者逻辑上等效的...

from operator import itemgetter
data = ((1,), (3,))
map(itemgetter(0), data)

这仅供参考;您应该使用列表组合

于 2011-05-13T23:58:19.443 回答