我有一个元组的元组,我想将每个元组中的第一个值放入一个集合中。我认为使用 map() 将是这样做的好方法,唯一的事情是我找不到访问元组中第一个元素的简单方法。例如,我有 tuple ((1,), (3,))
。我想做类似set(map([0], ((1,), (3,))))
([0]
访问第零个元素的地方)来获得一个包含 1 和 3 的集合。我能想到的唯一方法是定义一个函数:def first(t): return t[0]
. 无论如何,无需声明函数就可以在一行中执行此操作吗?
问问题
21725 次
8 回答
20
使用列表推导:
data = ((1,), (3,))
print([x[0] for x in data])
于 2011-05-13T23:49:09.003 回答
18
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 回答