Python: в любом случае использовать карту, чтобы получить первый элемент кортежа - PullRequest
12 голосов
/ 14 мая 2011

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

Ответы [ 8 ]

16 голосов
/ 14 мая 2011

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

data = ((1,), (3,))
print [x[0] for x in data]
12 голосов
/ 14 мая 2011
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]
4 голосов
/ 14 мая 2011
mySet = set(x[0] for x in TUPLES)

или в python3:

mySet = {x[0] for x in TUPLES}
2 голосов
/ 14 мая 2011
data = ((1,), (3,))
s = set(zip(*data)[0])

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

2 голосов
/ 14 мая 2011

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

set(x for x, in data)
2 голосов
/ 14 мая 2011

Вы можете использовать понимание набора в Python 2.7 и 3.x:

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

или в Python <2.7: </p>

>>> s = set([x[0] for x in t])
>>> s
set([1, 3])
2 голосов
/ 14 мая 2011

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

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

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

def f(x):
    return x[0]

set(map(f, data))

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

1 голос
/ 14 мая 2011

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

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

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

...