Python:De toute façon à l'utilisation de la carte pour obtenir le premier élément d'un tuple

StackOverflow https://stackoverflow.com/questions/5998835

  •  13-11-2019
  •  | 
  •  

Question

J'ai un tuple de tuples et je veux mettre de la première valeur dans chacun des tuples dans un ensemble.J'ai pensé à l'aide de la carte() serait une bonne façon de le faire, la seule chose est que je ne peux pas trouver un moyen facile d'accéder au premier élément du tuple.Ainsi, par exemple, j'ai le n-uplet ((1,), (3,)).J'aimerais faire quelque chose comme set(map([0], ((1,), (3,)))) (où [0] pour accéder à l'élément zéro) pour obtenir un ensemble avec 1 et 3 en elle.La seule façon que je peux figure de le faire est de définir une fonction: def first(t): return t[0].Est-il de toute façon de le faire en une seule ligne, sans avoir à déclarer la fonction?

Était-ce utile?

La solution

L'utilisation d'une compréhension de liste:

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

Autres conseils

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

Alors que les interprétations de la liste sont généralement plus lisible, itemgetter est le plus proche de ce qu'il a demandé.

Des informations de synchronisation:

>>> 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]
mySet = set(x[0] for x in TUPLES)

ou en python3:

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

Vous pouvez utiliser un ensemble de compréhension en Python 2.7 et 3.x:

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

ou en Python < 2.7:

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

Juste une autre façon de les obtenir:

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

Si il y a plus d'éléments dans votre tuples vous pourriez économiser de la mémoire et du temps à l'aide de izip et islice.

Python prend en charge la création de l'anonymat de la fonction à l'aide de la lambda mot-clé.Cela vous permet d'utiliser une fonction sans pour autant la définir.Compte tenu de votre exemple, vous pouvez utiliser le lambda comme ceci:

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

Ceci est équivalent à:

def f(x):
    return x[0]

set(map(f, data))

Mais comme d'autres personnes l'ont dit, les interprétations de la liste sont privilégiées par rapport à l'utilisation de la carte.

Aller avec @Winston.Interprétations de la liste sont grands.Si vous vraiment souhaitez utiliser une carte, utiliser une lambda comme suggéré précédemment, ou l'logiquement équivalent...

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

C'est juste pour info;Vous devez utiliser la liste comp

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top