Python: Во всяком случае, чтобы использовать карту, чтобы получить первый элемент кортежа

У меня есть кортеж кортежей, и я хочу поместить первое значение в каждый из кортежей в набор. Я думал, что использование map() было бы хорошим способом сделать это, единственное, что я не могу найти простой способ получить доступ к первому элементу в кортеже. Так, например, у меня есть кортеж ((1,), (3,)). Я хотел бы сделать что-то вроде set(map([0], ((1,), (3,)))) (где [0] обращается к нулевому элементу), чтобы получить набор с 1 и 3 в нем. Единственный способ, которым я могу это сделать, - определить функцию: def first(t): return t[0]. Есть ли способ сделать это в одной строке без объявления функции?

Ответ 1

Используйте понимание списка:

data = ((1,), (3,))
print [x[0] for x in data]

Ответ 2

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

В то время как понимание списка, как правило, более читаемо, itemgetter ближе всего к тому, что он просил.

Информация о времени:

>>> from timeit import Timer
>>> mapped = Timer(setup='from operator import itemgetter\nlst=( ("a",), ("b",), (1,), (2,))', stmt='map(itemgetter(0), lst)')
>>> comprehended = Timer(setup='lst=( ("a",), ("b",), (1,), (2,))', stmt='[i[0] for i in lst]')
>>> comprehended.repeat()
[0.5402599483924249, 0.47599876684973275, 0.48340872102501464]
>>> mapped.repeat()
[0.4333492937609478, 0.31100689245737456, 0.3106918944053909]

Ответ 3

mySet = set(x[0] for x in TUPLES)

или в python3:

mySet = {x[0] for x in TUPLES}

Ответ 4

Вы можете использовать определение набора в 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])

Ответ 5

Еще один способ получить его:

set(x for x, in data)

Ответ 6

data = ((1,), (3,))
s = set(zip(*data)[0])

Если в ваших кортежах больше предметов, вы можете сэкономить память и время, используя izip и islice.

Ответ 7

Python поддерживает создание анонимной функции с помощью ключевого слова lambda. Это позволяет использовать функцию без формального ее определения. Учитывая ваш пример, вы должны использовать лямбду следующим образом:

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

Это эквивалентно:

def f(x):
    return x[0]

set(map(f, data))

Но, как говорили другие люди, предпочтения в списках предпочтительнее использования карты.

Ответ 8

Перейдите с помощью @Winston. Перечисление понятий велико. Если вы действительно хотите использовать карту, используйте лямбда, как было предложено ранее, или логически эквивалентную...

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

Это только для информации; Вы должны использовать список comp