La concaténation de deux gamme fonction des résultats
N'fonction range permet la concaténation ? Comme je veux faire un range(30)
& concaténer avec range(2000, 5002)
. Donc, mon concaténées gamme sera 0, 1, 2, ... 29, 2000, 2001, ... 5001
Ce type de Code ne fonctionne pas sur mon dernier python (version: 3.3.0)
range(30) + range(2000, 5002)
- une version de python?
- la version de mon python est la version 3.3.0 .. j'ai également mis à jour dans ma question
- Ce que vous voulez obtenir comme résultat (comme dans, ce type de données, une liste ordinaire, un générateur, quelque chose d'autre)? Que voulez-vous faire avec le résultat?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
itertools.chaîne
pour cela:Il travaille pour arbitraire iterables. Noter qu'il y a une différence dans le comportement de
range()
entre Python 2 et 3 que vous devez savoir à propos de: en Python 2gamme
renvoie une liste, et en Python3 un itérateur, qui est efficace de la mémoire, mais pas toujours souhaitable.Listes peuvent être concaténées avec
+
, les itérateurs ne peut pas.Peut être fait en utilisant liste-de la compréhension.
Qui fonctionne pour votre demande, mais c'est une longue réponse, donc je ne vais pas le poster ici.
remarque: peut être fait dans un générateur pour des performances accrues:
ou même dans un générateur variable.
itertools
module est le standard. En raison de sa plus efficaces de mise en œuvre, la solution avecitertools.chain
est environ 3 fois plus vite -- voir stackoverflow.com/a/14101734/1346705. La morale est: "ne jamais dire Jamais!"Que j'aime le plus simple des solutions qui sont possibles (y compris l'efficacité). Il n'est pas toujours clair de savoir si la solution est telle. De toute façon, le
range()
en Python 3 est un générateur. Vous pouvez l'envelopper de toute construction qui ne itération. Lelist()
est capable de construction d'une liste de valeur à partir de n'importe quel itérable. Le+
opérateur de concaténation de listes n'. Je suis à l'aide de petites valeurs dans l'exemple:C'est ce que
range(5) + range(10, 20)
fait exactement dans Python 2.5 -- parce querange()
renvoyé une liste.En Python 3, il est seulement utile si vous voulez vraiment de construire la liste. Sinon, je recommande la Lev Levitsky de l' solution avec itertools.la chaîne. La documentation montre également très simple de mise en œuvre:
La solution par Inbar Rose est fine et fonctionnellement équivalent. De toute façon, mon +1 va à Lev Levitsky et à son argument sur l'utilisation de la norme des bibliothèques. De Le Zen de Python...
À mon avis, le
itertools.chain
est plus lisible. Mais ce qui est vraiment important...... il est environ 3 fois plus vite.
Avec l'aide de l'étendre méthode, on peut concaténer deux listes.
range()
en Python 2.x renvoie une liste:xrange()
en Python 2.x retourne un itérateur:Et en Python 3
range()
également retourne un itérateur:Il est donc évident que vous ne pouvez pas concaténer les itérateurs d'autres en utilisant
chain()
que l'autre gars l'a souligné.De python3.5+, vous pouvez utiliser itérable déballage dans les listes (voir PEP 448: Supplémentaires Déballage Des Généralisations).
Si vous avez besoin d'une liste,
Cela préserve l'ordre et de ne pas supprimer les doublons. Ou, vous voudrez peut-être un n-uplet,
... ou d'un ensemble,
Il arrive aussi d'être plus rapide que d'appeler
itertools.chain
.L'avantage de
chain
, cependant, est que vous pouvez passer un arbitraire liste de plages.Otoh, que, le déballage des généralisations n'ont pas été "généralisée" à l'arbitraire des séquences, de sorte que vous aurez toujours besoin de décompresser l'individu plages vous-même.
Je suis venu à cette question parce que j'essayais de concaténer un nombre inconnu de gammes, qui pourraient se chevaucher, et ne voulait pas les valeurs répétées dans le final de l'itérateur. Ma solution a été d'utiliser
set
et launion
opérateur like: