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